extensions
- 用于擴展現(xiàn)有的數(shù)據(jù)結(jié)構(gòu)绘梦。你可以添加方法/屬性 到 一個 類/結(jié)構(gòu)體/枚舉 (即便你沒有源碼)
比如說,這個方法為UIViewController 添加了一個方法 contentViewController
extension UIViewController {
var contentViewController:UIViewController {
if let navigtation = self as? UINavigationController {
return navigtation.visibleViewController
} else {
return self
}
}
}
- 有一些限制需要注意
- 只能添加新的屬性和方法赴魁,你不能重寫已經(jīng)存在的屬性和方法
- 只能添加計算屬性卸奉,不能添加存儲屬性
Protocols
- 協(xié)議是一種更精確的表示API的方式
一個API可以讓調(diào)用者傳遞調(diào)用者想要傳遞的任何 類/結(jié)構(gòu)體/枚舉(可以要求他們實現(xiàn)API想要的特定的方法或?qū)傩浴#?而不是強制調(diào)用者傳遞制定的 類颖御,結(jié)構(gòu)體或枚舉榄棵。
協(xié)議僅僅就是一些方法和屬性聲明的集合。
-
協(xié)議是一個類型
它可以像其他類型一樣潘拱,用在幾乎任何地方:變聲聲明疹鳄,函數(shù)參數(shù)等等。
-
實現(xiàn)協(xié)議方法和屬性
協(xié)議的實現(xiàn)是由諸如類芦岂,架構(gòu)體或枚舉等實現(xiàn)類型來提供的瘪弓,因此,協(xié)議可以擁有與之相關(guān)的非存儲對象禽最。協(xié)議中的任何存儲對象都需要由實現(xiàn)類型來實現(xiàn)润樱。
通過擴展向協(xié)議中添加方法也是可以的局嘁,但是要記住汇跨,擴展不能使用存儲屬性承粤。
協(xié)議的使用有三個方面:
- 協(xié)議聲明 (協(xié)議中有哪些屬性和方法)
- 類,結(jié)構(gòu)體或枚舉懦趋,聲明實現(xiàn)了這個協(xié)議
- 類晾虑,結(jié)構(gòu)體或枚舉 實現(xiàn)協(xié)議
協(xié)議中的可選實現(xiàn)方法
通常任何協(xié)議的實現(xiàn)者都必須要實現(xiàn)協(xié)議中所有的方法和屬性,然而是可以把某些方法標記為可選實現(xiàn)的仅叫。
任何方法想要可選實現(xiàn)帜篇,都必須標記為 @objc
任何可選協(xié)議的實現(xiàn)者都必須繼承自 NSObject
協(xié)議聲明:
protocol SomeProtocol:InheritedProtocol1,InheritedProtocol2{
var someProperty:Int{get set}
func aMethod(arg1:Double,anotherArgument:String)->SomeType
mutating func changIt()
init(arg:Type)
}
任何實現(xiàn)SomeProtocol協(xié)議的必須同時實現(xiàn)InheritedProtocol1和InheritedProtocol2。
必須要指定屬性是只讀的還是可讀可寫的
任何希望修改接受者的方法都需要標記為 mutating(除非你使用class關(guān)鍵詞限制制你的協(xié)議只能由類來實現(xiàn))
你甚至可以指定實現(xiàn)者必須提供一個指定的初始化方法诫咱。
枚舉和結(jié)構(gòu)體沒有父類坠狡,一些協(xié)議可以由給定的類,結(jié)構(gòu)體或枚舉實現(xiàn)遂跟。在類中,inits方法必須被標記為required 或者不遵守協(xié)議。
delegation
使用協(xié)議非常重要和簡單幻锁。
- 一個視圖聲明一個協(xié)議
- 這個View的API有一個弱代理引用
- 這個視圖使用代理做一些事情
- 控制器聲明遵守了協(xié)議
- 控制器把自己聲明為代理
- 控制器實現(xiàn)代理方法