;
3.OC swift不支持多继承, 但是可以通过协议,间接实现多继承
4.协议的继承关系
4.1 swift中的及协议和OC(NSObject)中的不同 是:NSObjectProtocol
1 protocol CrazySportProtocol : NSObjectProtocol {
2 func jumping()
3 }
4.2 一个协议,可以遵守另一个协议
1 protocol SportProtocol : CrazySportProtocol {
2 func playBasketball()
3 }
当一个类遵守了这个协议(SportProtocol) 相当于也遵守了CrazySportProtocol 协议, 所以必须实现这两个协议中的方法
5.协议的可选性
5.1 OC中协议可以定义为可选和必选,默认是必选的
5.2 默认情况下,swift中的协议都是必须实现的 ,否则编译器会报错
5.3 在swift中如何让协议成为可选的(不用必须实现)
要在协议前加 @objc ,可以保留OC某些特性,在方法前加optional 该方法就是可选的了
在实现协议方法时,在方法前面也要加@objc
1 @objc protocol SportProtocol {
2 func playBasketball()
3 func playFootball()
4 //加optional该方法就成为可选的了
5 optional func jumping()
6 }
7
8 class Person: SportProtocol {
9 @objc func playBasketball() { 在方法前也要加上关键字@objc,不管是可选还是必选
10 }
11 @objc func playFootball() {
12 }
13 @objc func jumping() {
14 }
15 }
6.协议在代理模式中的使用
6.1 一般来说协议都用weak来修饰(弱引用)
6.2 weak只能用来修饰类
6.3 在swift中协议既可以被类遵守,也可以被结构体,枚举遵守
6.4 如何让协议只能被类准守
在协议名称后面加上 :class 即可
四.闭包
1.什么是闭包?
闭包和OC中的block非常相似,一般都用来函数的回调
2.block的回顾
block作为属性的格式: `@property (nonatomic, strong) void(^finishedCallback)(NSString *)`;
block作为参数的定义格式:` (void (^)(NSString * str))finishedCallback`
3.闭包的格式:
(参数列表) -> (返回值类型)
4.闭包的使用
5.尾随闭包
1 // 尾随闭包 : 如果函数的最后一个参数是一个闭包.那么可以将函数调用写成尾随闭包
2 //就是把闭包写到()的后面, 本来是写在()里面的
3 tools?.loadData() { (result) in
4 print("在ViewController中获取到数据:\(result)")
5 }
6
7 // 如果函数有且只有一个参数,并且是一个闭包, 那么()也可以省略
8 tools?.loadData { (result) in
9 print("在ViewController中获取到数据:\(result)")
10 }
6.闭包的循环引用
6.1 一般在定义工具类的时候,会在工具类的方法中用到闭包
6.2 当工具类对闭包有强引用,一个控制器又调用包含该闭包的方法,在闭包方法中使用控制器的属性,就会发生循环引用
6.3 控制器调用方法,就会对工具类有一个强引用, 闭包又拿到控制器的属性,闭包对象就对控制器有一个强引用
6.4 在内存中就相当于这种表现
7.怎么解决闭包的循环引用
与oc中类型,只需要把闭包对控制器的引用改为弱引用
8.怎么改?
当闭包修改控制器的属性时,拿到控制器的属性时,把self(控制器)改成weakself即可
weak var weakself : ViewController? = self
五.swift项目的目录结构简介
1.swift项目目录中没有.h和.m的文件, 只有一个.swift的文件,相当于
2.swift目录中.swift文件就相当于oc中的.h和.m文件
3.在swift中,调用项目中的其他源文件不需要导入头文件 (一个 .swift文件就是一个源文件)
六.懒加载
1.懒加载的介绍
1.1 和OC中不同,swift有专门的关键字实现懒加载
1.2 懒加载本质:当第一次使用时再加载,而且只会被加载一次
2.swift中用lazy关键字来实现懒加载
2.1 懒加载格式