1. 闭包
Swift中的闭包和OC中的block 相似
是一个预先定义好的代码块
在我们需要的时候执行
它可以作为参数 还有 返回值
使用它的时候 代码块中使用self 注意循环引用
2.尾随闭包
1) 当我们定义的函数中 只有一个参数且是闭包的话 那么函数的 会提前关闭而且()会省略
2) 当我们定义的函数中 最后一个参数为闭包的话 那么函数的()会提前关闭
3. - 对象销毁 自己写dealloc
KVO移除
移除通知
NSTimseler
4.swift中的deinit 它是一个析构函数,相当于oc中的dealloc
5.防止self在闭包当中的使用
weak var weakSelf = self weakSelf?.view
[weak self] in//__weak
[unowned self] in// __unsafe_unretained)
6.构造函数的详细解释
1)创建init(重写父类的init方法,先初始化再super.init)
//下面的方式相当于oc里面的构造方法
class Person: NSObject {
// 名字
var name:String
// 年龄
var age:Int
override init() {
name = "老王"
age = 18
// Swift2.0以后 系统默认帮我们调用super.init()建议大家自己写上
super.init()
}
}
7.重载:方法名相同,参数不相同,
重写:方法名相同,参数相同,只是重写父类的方法
//下面的方法相当于oc里面的自定义构造方法
//以下同样是先初始化子类的属性在调用父类的初始化方法初始化父类,但是相比较于重写的构造函数,子类参数的数值是外界提供的,而不是自己内部定义好的
init(name: String, age: Int, no: String) {
self.no = no
super.init(name: name, age: age)
}
记住:重载的构造函数会屏蔽系统提供好的构造函数,如果需要手动重写
8. kvc构造函数
init(dict: [String: AnyObject]) {
super.init()
// 原因: 一下方法属于父类 必须把父类初始化ok后才可以使用父类的方法
setValuesForKeysWithDictionary(dict)
}
//使用kvc构造方法赋值时
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
print("没找到(key)")
}
KVC 运行时 动态向对象发送setValueForKey
子类继承父类的方法,所以即便是多出来的key也能通过继承来的kvc方法将自己新增加的key 和value赋值,子类无需再定义构造方法,使用简单
使用kvc的几点注意:
1: 基本数据类型 而且是可选值 与KVC 不兼容, 解决方法: 给基本数据 设置默认值 或者初始化
2. setValuesForKeysWithDictionary方法属于父类 必须把父类初始化ok后才可以使用父类的方法
3. 重写父类已有的setValueforUndefinedKey 只需要空实现
kvc的实现流程:
01 setValuesForKeysWithDictionary(dict)
02 字典转模型 (setValue(value: AnyObject?, forKey key: String))实现动态的字典转模型
03 通过字典中的key来找我们对象身上的属性是否和key是否一致如果一致如果其对象身上的属性 没有初始化 它会帮助初始化 然后赋值如果已经初始化 直接赋值如果不一致 或者我们使用的属性基本数据类型而且是可选值如果没有找到key 会调用该方法 setValue(value: AnyObject?, forUndefinedKey key: String)
9.遍历构造函数:
convenience 是我们便利构造函数的修饰符
是一个可失败的构造函数可以返回nil
便利构造函数内部是调用self (便利构造函数只能调用父类的构造函数 或者自己的当前类的 指定构造函数完成初始化)
便利构造函数不能被重写,但可以继承
10.懒加载:
Swift 使用lazy 来修饰懒加载
在我们需要的时候创建 系统帮我们吧我们这个对象保存起来 如果我们再次使用的时候 直接使用 不需要重复创建
创建方式一共两种:
方式01
lazy var p: Person = Person()
方式02(通过闭包的方式)
lazy var p1: Person = {
let p = Person()
p.name = "老王"
return p
}()
11,只读属性
1)首先是存储属性:
即能存 用能取
开辟空间 占用内存
当外界给其设置值的时候 会调用didSet 方法
使用方式为:
var name: String?{
// 当外界给其设置值的时候 会调用didSet 方法
didSet{
print("哈哈")
}
}
2) 计算型属性
只能取 不能存
消耗cpc
3)类似于oc的set和get方法”
private 使用其对类中的属性 或者方法私有化 只能咋其类内部使用
private var _name: String?
var name: String?{
get{ return _name
}
set{
//newValue 当外界给其对象身上的属性赋值的时候 系统会直接newValue 完成赋值
_name = newValue
}
}