extensions
- 用于扩展现有的数据结构。你可以添加方法/属性 到 一个 类/结构体/枚举 (即便你没有源码)
比如说,这个方法为UIViewController 添加了一个方法 contentViewController
extension UIViewController {
var contentViewController:UIViewController {
if let navigtation = self as? UINavigationController {
return navigtation.visibleViewController
} else {
return self
}
}
}
- 有一些限制需要注意
- 只能添加新的属性和方法,你不能重写已经存在的属性和方法
- 只能添加计算属性,不能添加存储属性
Protocols
- 协议是一种更精确的表示API的方式
一个API可以让调用者传递调用者想要传递的任何 类/结构体/枚举(可以要求他们实现API想要的特定的方法或属性。) 而不是强制调用者传递制定的 类,结构体或枚举。
协议仅仅就是一些方法和属性声明的集合。
-
协议是一个类型
它可以像其他类型一样,用在几乎任何地方:变声声明,函数参数等等。
-
实现协议方法和属性
协议的实现是由诸如类,架构体或枚举等实现类型来提供的,因此,协议可以拥有与之相关的非存储对象。协议中的任何存储对象都需要由实现类型来实现。
通过扩展向协议中添加方法也是可以的,但是要记住,扩展不能使用存储属性。
协议的使用有三个方面:
- 协议声明 (协议中有哪些属性和方法)
- 类,结构体或枚举,声明实现了这个协议
- 类,结构体或枚举 实现协议
协议中的可选实现方法
通常任何协议的实现者都必须要实现协议中所有的方法和属性,然而是可以把某些方法标记为可选实现的。
任何方法想要可选实现,都必须标记为 @objc
任何可选协议的实现者都必须继承自 NSObject
协议声明:
protocol SomeProtocol:InheritedProtocol1,InheritedProtocol2{
var someProperty:Int{get set}
func aMethod(arg1:Double,anotherArgument:String)->SomeType
mutating func changIt()
init(arg:Type)
}
任何实现SomeProtocol协议的必须同时实现InheritedProtocol1和InheritedProtocol2。
必须要指定属性是只读的还是可读可写的
任何希望修改接受者的方法都需要标记为 mutating(除非你使用class关键词限制制你的协议只能由类来实现)
你甚至可以指定实现者必须提供一个指定的初始化方法。
枚举和结构体没有父类,一些协议可以由给定的类,结构体或枚举实现。在类中,inits方法必须被标记为required 或者不遵守协议。
delegation
使用协议非常重要和简单。
- 一个视图声明一个协议
- 这个View的API有一个弱代理引用
- 这个视图使用代理做一些事情
- 控制器声明遵守了协议
- 控制器把自己声明为代理
- 控制器实现代理方法