1.函数

2.闭包

3.构造函数基础

4.重载构造函数

5.KVC构造函数

6.遍历构造函数

7.懒加载

8.只读属性

1.函数

  • 掌握函数的定义
  • 掌握外部参数的用处
  • 掌握无返回类型的三种函数定义方式

/*

- 无参数无返回值的函数

- 格式: func 函数名(){代码逻辑}

*/

/*

- 有参数无返回值的函数

- 格式: func 函数名(外部参数1 形参1: 形参类型,...){代码逻辑}

- Swift默认 第一个参数的名省略

- 一般情况下 如果自己使用的函数没有必要定义外部参数

*/

外部参数

  • 在形参名前再增加一个外部参数名,能够方便调用人员更好地理解函数的语义
  • 格式:func 函数名(外部参数名 形式参数名: 形式参数类型) -> 返回值类型 { // 代码实现 }
  • Swift 2.0 中,默认第一个参数名省略

/*

- 有参数有返回值的函数

- 格式: func 函数名(外部参数1 形参1: 形参类型,....) -> 返回值类型 {代码逻辑 return 返回值}

*/

2.闭包

与 OC 中的 Block 类似,闭包主要用于异步操作执行完成后的代码回调,网络访问结果以参数的形式传递给调用方

目标

  • 掌握闭包的定义
  • 掌握闭包的概念和用法
  • 了解尾随闭包的写法
  • 掌握解除循环引用的方法

OC 中 Block 概念回顾

  • 闭包类似于 OC 中的 Block
    • 预先定义好的代码
    • 在需要时执行
    • 可以当作参数传递
    • 可以有返回值
    • 包含 self 时需要注意循环引用

闭包的定义

/*<

- 闭包的定义

- 它和OC中的block相似

- 闭包是一个代码块 在我们需要的时候执行

- 闭包可以作为参数 或者 返回值

- 使用闭包 闭包内使用self 注意循环引用

- 一般情况下 我们均使用let 定义闭包

*/

/*

- 无参数无返回值的闭包

- 格式 let 闭包名 = {代码逻辑}

*/

func AA2(){

let closure = {

print("哈哈")

}

// 执行闭包

closure()

}

/*

- 有参数无返回值的闭包

- 使用in 把代码逻辑和参数隔开

- let 闭包名 = {(形参名: 类型,...) in 代码逻辑} -> 常用方式

- let 闭包名 = {(形参名: 类型,...) -> () in 代码逻辑}

- let 闭包名 = {(形参名: 类型,...) -> Void in 代码逻辑}

*/

func BB2(){

let closure = {(a:Int, b: Int) in

let result = a + b

print(result)

}

closure(5,10)

}

/**

-有参数有返回值的闭包

- 格式: let 闭包名 = {(形参名: 类型,...) -> 返回值类型 in 代码逻辑 return}

*/

func CC2(){

let closure = {(a: Int , b: Int) -> Int in

return a + b

}

// 执行闭包

let result = closure(5,6)

print(result)

}

自定义闭包参数,实现主线程回调

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

//        // 定义一个闭包

//        // 代表 01 和 02

// 写法 01

let closure = {(result: String) -> () in

// 代表 04

print(result)

}

// 执行请求方法

loadData(closure)

// 写法 02

loadData({(result: String) -> () in

// 代表 04

print(result)

})

// 写法 03 常用方式

loadData { (result) -> () in

print(result)

}

}

// 模拟请求数据

func loadData(callback:(result: String) -> ()){

// 开启子线程

dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in

// 线程睡眠

NSThread.sleepForTimeInterval(2)

// 模拟请求回来数据

let str = "办证137xxxxxxxx"

// 回到主线程

dispatch_async(dispatch_get_main_queue(), { () -> Void in

// 执行闭包

// 代表 03

callback(result: str)

})

}

}

}

3.构造函数基础

构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值,在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重载,所有的构造函数都是 init

构造函数的作用

  • 分配空间 alloc
  • 设置初始值 init

自定义 Person 对象

/*

- Swift中 构造方法名 均为init

- override 重写

- 如果子类继承父类 做自己特有的事情(给我身上的name 和age 赋值) 需要重写父类以后方法

- Swift 2.0 以后 super.init() 系统默认隐私调用

- 建议大家写上

- 如果你继承了父类 使用父类的init 方法 要重写 然后super.init()

- 如果你身上有必选属性 一定要在init方法中初始化 然后在 super.init()

*/

提示错误 Class 'Person' has no initializers -> 'Person' 类没有实例化器s

原因:如果一个类中定义了必选属性,必须通过构造函数为这些必选属性分配空间并且设置初始值

提示错误 Property 'self.name' not initialized at implicitly generated super.init call -> 属性 'self.name' 没有在隐式生成的 super.init 调用前被初始化

提示错误 Property 'self.name' not initialized at super.init call -> 属性 'self.name' 没有在 super.init 调用前被初始化

小结

  • 非 Optional 属性,都必须在构造函数中设置初始值,从而保证对象在被实例化的时候,属性都被正确初始化
  • 在调用父类构造函数之前,必须保证本类的属性都已经完成初始化
  • Swift 中的构造函数不用写 func

子类的构造函数

  • 自定义子类时,需要在构造函数中,首先为本类定义的属性设置初始值
  • 然后再调用父类的构造函数,初始化父类中定义的属性

小结

  • 先调用本类的构造函数初始化本类的属性
  • 然后调用父类的构造函数初始化父类的属性
  • Xcode 7 beta 5之后,父类的构造函数会被自动调用,强烈建议写 super.init(),保持代码执行线索的可读性
  • super.init() 必须放在本类属性初始化的后面,保证本类属性全部初始化完成

4.重载构造函数

  • Swift 中支持函数重载,同样的函数名,不一样的参数类型

注意事项

  • 如果重载了构造函数,但是没有实现默认的构造函数 init(),则系统不再提供默认的构造函数
  • 原因,在实例化对象时,必须通过构造函数为对象属性分配空间和设置初始值,对于存在必选参数的类而言,默认的 init() 无法完成分配空间和设置初始值的工作

调整子类的构造函数

  • 重写父类的构造函数

/*

重写构造函数

方法名 相同 参数不同

- 如果程序员定义了重载构造函数 但是没有重写父类的构造函数 那么系统将不再提供该构造函数

- 如果提供了 那么其身上的必选属性父类是不知道为你初始化的

*/

重载构造函数

重载和重写

  • 重载,函数名相同,参数名/参数类型/参数个数不同
    • 重载函数并不仅仅局限于构造函数
    • 函数重载是面相对象程序设计语言的重要标志
    • 函数重载能够简化程序员的记忆
    • OC 不支持函数重载,OC 的替代方式是 withXXX...
  • 重写,子类需要在父类拥有方法的基础上进行扩展,需要 override 关键字

5.KVC构造函数

/**

- KVC 作用

- 字典转模型

- 本质 动态的向对象身上发送setValueForKey 给对象身上的属性赋值

- 给只读属性 赋值

*/

    • KVC 是 OC 特有的,KVC 本质上是在运行时,动态向对象发送 setValue:ForKey: 方法,为对象的属性设置数值
    • 因此,在使用 KVC 方法之前,需要确保对象已经被正确实例化
  • 添加 super.init() 同样会报错
  • 原因:
    • 必选属性必须在调用父类构造函数之前完成初始化分配工作

/*

- KVC调用流程

- 01 KVC构造函数

- 02 setValuesForKeysWithDictionary

- setValue(value: AnyObject?, forKey key: String) 给类里面的属性赋值

- 如果其属性已经初始化  那么系统直接赋值 等同于 age

- 如果其属性没有初始化  那么系统帮我们初始化 然后赋值 等同于 name

- 如果字典中对象的key 没有在模型中找到对象的属性

-setValue(value: AnyObject?, forUndefinedKey key: String)

*/

  • setValuesForKeysWithDictionary 会按照字典中的 key 重复调用 setValue:forKey 函数
  • 如果没有实现 forUndefinedKey 函数,程序会直接崩溃
    • NSObject 默认在发现没有定义的键值时,会抛出 NSUndefinedKeyException 异常
  • 如果实现了 forUndefinedKey,会保证 setValuesForKeysWithDictionary 继续遍历后续的 key
  • 如果父类实现了 forUndefinedKey,子类可以不必再实现此函数

6.convenience 便利构造函数

  • 默认情况下,所有的构造方法都是指定构造函数 Designated
  • convenience 关键字修饰的构造方法就是便利构造函数
  • 便利构造函数具有以下特点:
    • 可以返回 nil
    • 只有便利构造函数中可以调用 self.init()
    • 便利构造函数不能被重写或者 super

/*

- 便利构造函数

- convenience 便利构造函数的标识

- 可失败的构造器

- 可以返回nil

- 内部使用self 完成初始化

- 不能被重写 或者super

- 便利构造函数完成初始化 必须调用其父类或者自己类的构造函数完成初始化(最终他一定是调用了指定构造函数)

- 指定构造函数

- 如果通过指定构造函数初始化一个对象 一定存在 而且不为nil

- 便利构造函数

- 它可以返回nil

*/

便利构造函数应用场景

  • 根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来
  • 在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建

7.懒加载

懒加载本质上是一个闭包

/*

- 懒加载

- 在我们需要的时候创建 系统会帮我们保存这个对象 再我们下次使用的时候 直接返回

- lazy

*/

8.只读属性

存储型属性 & 计算型属性

  • 存储型属性 - 需要开辟空间,以存储数据
  • 计算型属性 - 执行函数返回其他内存地址

计算型属性

  • 只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性
  • 计算型属性本身不占用内存空间
  • 不可以给计算型属性设置数值
  • 计算型属性可以使用以下代码简写

// 只读属性 可以吧get省略(计算型属性)

/*

只能取 不能存

不会开辟内存空间

返回值一个存储型属性

消耗cpu

*/

// 存储型属性

/*

既能存 又能取

开辟内存空间

*/

计算型属性与懒加载的对比

  • 计算型属性
    • 不分配独立的存储空间保存计算结果
    • 每次调用时都会被执行
    • 更像一个函数,不过不能接收参数,同时必须有返回值
  • 懒加载属性

    • 在第一次调用时,执行闭包并且分配空间存储闭包返回的数值
    • 会分配独立的存储空间
    • 与 OC 不同的是,lazy 属性即使被设置为 nil 也不会被再次调用

swift入门-day02的更多相关文章

  1. Swift入门学习之一常量,变量和声明

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6059421.html Swift入门学习之一常量,变量和 ...

  2. Swift入门篇-闭包和函数

    今天主要是给大家分享的是 swift中闭包的用法,我个人觉得闭包就是函数的简写方法,如果您函数不是很熟悉请查阅 swift入门篇-函数 1:函数类型 函数类型 var 变量 :(类型)->返回值 ...

  3. Swift入门篇-循环语句

    今天早上一起来所有新闻都是报道荷兰5-1战胜西班牙,我一看没有搞错吧,顿时想都如果中国队vs荷兰队也不至于会输的怎么惨吧,难道是荷兰队开挂了,于是我看了一下昨天比赛的视频直播,还真是新闻报道的那样,顿 ...

  4. Swift入门篇-字符串和字符

    今天主要是介绍一下字符串的用法 ,字符串的语法和object-c语法不太一样,但是思想是一样,就是写法不太一样.如果您对.net和java语法比较熟悉的话,那您几乎没有深压力.如果您对swift 基本 ...

  5. Swift入门篇-基本类型(2)

    现在我也在学习Swift语言,常常去逛很多苹果社区和论坛,看到了圈子很多奇怪的现象,发现很多人都赶忙去翻译 Swift书籍 和 发布Swift的视频 .他们这种对新知识的探索精神我本人是很佩服的.但是 ...

  6. Swift入门篇-Hello World

    提示:如果您使用手机和平板电脑看到这篇文章,您请在WIFI的环境下阅读,里面有很多图片, 会浪费很多流量. 博主语文一直都不好(如有什么错别字,请您在下评论)望您谅解,没有上过什么学的 最近这2天主要 ...

  7. Swift入门教程:基本语法大全

    原文:Swift入门教程:基本语法大全       简介:                                                                        ...

  8. Swift入门(五)——数组(Array)

    集合 集合的定义 Swift中提供了两种数据结构用于存放数据的集合,各自是数组(Array)和字典(Dictionary). 他们的主要差别在于数组中的元素由下标确定.而字典中的数据的值由数据的键(K ...

  9. Swift入门(一)——基本的语法

    近期開始学习swift.把学习的过程和总结整理成一个系列.方便日后回想总结. 基本的语法 基础语法 swift中每一行结束后不须要加分号.多个语句在同一行内须要用分好隔开 //表示凝视.或者用/* - ...

随机推荐

  1. Robotium 系列(1)

    之前也写过一些blog,可是没什么坚持.这个系列算是对之前工作的一个总结和提高:也与大家共同进步! 本文主要介绍的内容是: 1. 软件测试的基本概念 2. 自动化测试的概念 3. 手动测试和自动化测试 ...

  2. JavaScript下拉框去除重复内容

    下拉框去除重复内容 <script type="text/javascript" src="http://www.joleye.com/libraries/java ...

  3. EMC

    1.EMC的概念 EMC(Electro Magnetic Compatibility)即电磁兼容,是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的能力.就是它 ...

  4. 【解决】Oracle数据库实现ID自增长

    Oracle数据库要实现ID的自增长,需要创建一个序列和触发器来实现,略微有一点点麻烦,但是也是可以解决的. 直接上地址,首先,http://www.wlcrane.com/article.aspx? ...

  5. Yii Listview 更新及搜索

    更新: http://my.oschina.net/shixiaobao17145/blog/130992 http://www.yiiframework.com/forum/index.php/to ...

  6. 2015AppStore 上传步骤及常见问题

      ——————辛苦手写,转载请注明出处!——————   *************华丽分割线*****************   一.注意开发者账号:注意格式不能有一点错. 二.下载证书:生成描 ...

  7. Shiro 源码分析

    http://my.oschina.net/huangyong/blog/215153 Shiro 是一个非常优秀的开源项目,源码非常值得学习与研究. 我想尝试做一次 不一样 的源码分析:源码分析不再 ...

  8. Spring AOP切面

    在软件开发中,分布于应用多出的功能被称为和横切关注点. 通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(可是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离正是面向切面编成( ...

  9. Unsupervised Feature Learning and Deep Learning(UFLDL) Exercise 总结

    7.27 暑假开始后,稍有时间,“搞完”金融项目,便开始跑跑 Deep Learning的程序 Hinton 在Nature上文章的代码 跑了3天 也没跑完 后来Debug 把batch 从200改到 ...

  10. mysql选择联合索引还是单索引?索引列应该使用哪一个最有效?深入測试探讨

    先建表 CREATE TABLE `menu_employee` ( `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键,无实际意义', `emplo ...