多态概念
编译时
: 在编译时确定的,编译器只认编译时类型
运行时
: 实际赋值的实例决定
相同类型的变量,调用同一个方法时呈现不同的行为特征,就叫多态
向下转换
向下转换是为了解决这个问题: 编译器只认编译时,所以要强制转换为正确的类型。
- is运算符: 在强制类型转换之前,首先判断一个引用变量是否可以成功转换
- as运算符向下转型
- as 编译时就能确定
- as? as! 可选形式的向下转换
Any 可代表任何类型,包括Int 基础值类型
AnyObject 可代表任何类的实例
嵌套类型
扩展功能
注意
1. 使一个已有类型符合一个或者多个协议
2. 不能添加实例存储属性
3. 通过扩展可变方法可以改变值类型的实例方法
协议
注意
- 实现类可以采用存储属性和计算属性来实现协议要求的属性
- 可变、费可变方法均可实现协议的可变方法,但只有非可变方法才能实现协议中的非可变方法。
- 使用类实现协议,必须用required 修饰该构造器, 除非使用final 修饰,可省略require
- 如果实现协议的构造,同时重写了父类的构造器,则必须同时使用required override。
协议用途
协议相当于一个彻底抽象的类型,可做以下用途:
- 使用协议声明变量
- 使用协议作为函数、方法、构造器的形参类型、返回值类型
- 协议作为泛型参数,如制定数组 字典的元素类型
- 协议作为 is as as? as! 运算符最后一个操作数
- 在实现某个协议时,和继承某个父类的本质一样,协议实现类型的实例,完全可以当成协议实例来使用
- 变相协议变成,就像其他语言的面向接口变成一样,提供非常好的灵活性,这是多态的价值所在
特殊用法
合成协议
把多个协议当成一个使用
protocol <协议1, 协议2, 协议3, …>- 通过扩展为已有的类型添加协议
- Class-Only协议 也叫唯类协议, 不可被非类使用
protocol 协议名 : class , 协议1, 协议2, … 可选协议
:
可选协议是为了兼容Objective-C的,所以要@objc 修饰, 同时只能被类使用,所以他是 Class-Only协议
用 optional 修饰属性、下表、方法等- 协议扩展
针对协议进行拓展,给实现该协议的类型都可以使用协议扩展的属性、方法和下表 CustomStringConvertible协议
实现description方法,和Objective-C的description方法一致Hashable协议 是 Equatable 的子协议
Hashable 重载 == 运算符
Equatable 重载hashValue 方法
封装
模块
:单独应用、框架就是一个模块
public
可被任意模块和文件使用
internal
默认,同一模块可使用
private
仅在当前源文件使用
在测试时,import中添加 @testable 修饰,保证测试target可以访问所有internal实体
访问最高准则,所有实体只能指定比他所依赖的实体更低或者相等的访问权限。
规则
- Swift是强类型的语言,但是默认权限均为internal,如果被依赖的实体更低,则要显示地把实体申明为更低,也就是private。 以免编译错误
- 元祖的访问权限是所有成员类型的最低级别
- 子类权限不高于父类权限
- 函数权限不高于参数和返回值权限
- 子类可以重载重现暴露父类的private权限
- 协议成员和协议总是具有相同的访问权限
内存管理
- Swift 使用ARC管理内存
- Swift 内存引用循环: 相互引用、 闭包对象相互引用
- 使用弱引用 weak 或者无主引用 unowned
- 当总是相互引用,且同时销毁,应当申明为无主引用,而当引用可能会为nil时,使用弱引用