標籤:
協議(Protocols)
協議僅是用定義某些任務或者是功能必須的方法和屬性。
類似於java裡的interface的作用。但協議並不會實現詳細的功能。
我猜這個名字源於OO中提到的“契約”。但我並不認為這名字非常好,反而是interface這名字更容被接受。由於我認為協議這個名字非常easy和網路編程的時候的網路通訊協定搞混,網路通訊協定也通常簡稱為協議。
文法:protocol MyProtocol { //協議定義}
struct MyStruct: MyProtocol1, MyProtocol2 { …...}
class MyClass: MyBaseClass, MyProtocol { …...}
協議寫得與繼承沒有什麼區分,所以這種話。我們是不是就須要把協議的名字專門加上xxxxProtocol以區分究竟是繼承還是協議,以便讓別人一眼就看明確。
。。。。
唉,無奈的文法
protocol MyClassProtocol {
class var num:Int {get} //get表示僅僅讀屬性
}
struct MyStruct : MyClassProtocol { //編譯器會提示 //Type’MyStruct’ does not //conform to protocol ‘MyClassProtocol‘
}
協議中寫了class。說明num是一個類成員,所以不能用在struct上,假設要用在struct中的話,要寫為static,這一點,與前面說的類屬性和結構體屬性一章的內容一致。
可是非常有趣的一點是,對於protocol來說,他本該是一條嚴格的規則。全部的條目必須滿足它的規定,然而,並不盡然。比如上面的{get},這樣並沒寫set方法的話,意思為僅僅讀,可是,我們依舊能夠在類的實現中寫出set方法(必須提供get)。可是假設不定義num的實現就不行。所以protocol並不嚴格。我們就僅僅把它理解為“至少滿足”的條件好了。
方法的定義事實上也一樣:protocol MyProtocol { class func myMethod() //類方法}
protocol MyProtocol { func myMethod() -> Int //執行個體方法}
protocol MyMutating { mutating func myMethod() //突變方法(結構體,枚舉)}
協議類型如今除了基本類型,枚舉。結構體,類,我們又多了一種類型。協議。
協議能夠作為函數的參數。返回值。常量。變數等等。。。
protocol MyClassProtocol {
var num:Int {get}
}
class MyClass1:MyClassProtocol {
var num:Int = 1
var name = "class1"
}
class MyClass2 :MyClassProtocol {
var num:Int = 2
var typeName = "MyClass2"
}
class MyTestClass {
var handle:MyClassProtocol //作為變數類型
init(handle:MyClassProtocol){ //作為函數參數
self.handle = handle
}
}
var c1 = MyClass1()
var c2 = MyClass2()
var t1 = MyTestClass(handle: c1)
var t2 = MyTestClass(handle: c2)
在這個範例中,能夠看出,handle更像是一個多態的應用,他能夠接受不論什麼一個滿足MyClassProtocol協議的執行個體作為變數值。
代理事實上如今還用了非常多設計模式,都沒有被拿出來說,然而這個模式卻要拿出來強調。或許是和蘋果的UI設計架構有非常大關係。事實上這塊就是在講,swift希望我們怎樣來實現多態。不多說了。
協議繼承這個跟類繼承非常像:protocol MyProtocol: MyProtocol1, MyProtocol2{
}
協議組合假設我們須要讓參數的類型同一時候支援非常多個協議的話。我們就能夠用協議的組合。能夠通過protocol<MyProtocol1, MyProtocol2>的形式來完畢協議的組合.
官方的範例:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VwZXJnZXJt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >
協議一致性檢查在之前筆記中,我們使用 is 和 as 對類的執行個體類型進行檢查和轉換,如今我們也能夠用這兩個操作符對協議進行操作。所以,不須要再反覆的舉例了。(事實上本質上與類中的操作無不論什麼差別。由於協議無非就是類定義的一種特殊形式罷了。非要說結構體的話,那麼它也是結構體定義的一種特殊形式,以及枚舉。)
可選協議@objc protocol MyProtocol { //@objc 說明這協議是可選的 @optional func myFunc() //@optional 指出這種方法是可選的 @optional var myNum:Int {get} // 指出這個變數是可選的}
可選我們已經說過太多了,僅僅要知道這個就能夠了,也不用舉例了。
著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。
swift 筆記 (十九) —— 協議