protocol(協議)
用於統一方法和屬性的名稱,而不實現不論什麼功能。
協議可以被類。列舉。結構體實現。滿足協議要求的類,列舉,結構體被稱為協議的
遵循者。
遵循者須要提供
協議指定的成員,如屬性,方法,操作符,下標等。
一、協議的基本的語法
咱們還是先上**吧
protocol human
var isman:bool
class var isusable:bool //類成員。表示這個類是否可用
func agedescription(ages:int...) //函式引數能夠是變長引數
}class student
class primarystudent:student,human
set}
var isman:bool
init(name:string,isman:bool)
func agedescription(ages:int...)
println("this man age is \(agecount)")
}}
重點:① 遵守某個協議須要像繼承一樣。在:後面加入這個協議
② 假設既要繼承又要遵守協議,須要把繼承的父類放在最前面
③ 對於協議中的屬性,須要標明屬性的讀寫型別,能夠是讀寫或者僅僅讀(不能僅僅寫不讀)
④ 對於類成員,須要在協議中的屬性前面加
class
keyword,假設是類遵守協議加
class
keyword,假設是列舉或者結構體遵守協議加
static
keyword
⑤ 協議中方法支援變長引數,但不支援引數預設值
二、協議型別
雖然協議
本身並不實現不論什麼功能,可是
協議能夠被當做型別來使用。
使用場景:
協議型別
作為函式、方法或構造器中的引數型別或返回值型別
協議型別
作為常量、變數或屬性的型別
協議型別
作為陣列、字典或其它容器中的元素型別
protocol randomnumbergenerator
class dice
func roll() -> int
}class linearcongruentialgenerator: randomnumbergenerator
}var d6 = dice(sides: 6,generator: linearcongruentialgenerator())
解釋:在dice中。
generator是
randomnumbergenerator
協議型別。
所以僅僅能使用遵守
randomnumbergenerator
協議的類、結構體、列舉型別給他賦值。在後面我們能夠看到,在初始化的時候使用遵守
randomnumbergenerator
協議的linearcongruentialgenerator
給他賦值了
三、託付**模式
玩過objective-c的朋友相比對託付**非常熟悉了,swift中的託付**和oc的大同小異,我們還是來看看**吧
protocol namecomplete
class student
}init(name:string,delegate:namecomplete)
}class dosth:namecomplete
}var a = dosth()
var b = student(name:"",delegate:a)
b.name = "小笨狼" //輸出:name:小笨狼 is set
解釋:namecomplete是乙個**。dosth遵從並實現這個**,student呼叫**。
在student中name被賦值之後,**中namesetcompleted方法會被呼叫
三、可選協議
玩過oc的朋友知道。oc中協議有的方法是可選的。在swift中協議也有這個功能,以下我們來看看
@objc protocol human
@optional func descript()
}class student:human
}
重點:① 對於可選方法或者屬性。須要在方法或者屬性前加上
@optional
keyword
② 假設協議中含有可選方法或者屬性,在定義協議時須要在
protocol
前加上@objc
keyword
③ 在可選協議中,不能出現oc沒有的型別。比方變長型別
④ 可選協議僅僅能被類遵從
四、協議繼承
協議和類一樣。也能夠繼承
protocol pname
}protocol dname:pname
class human:dname
}
解釋:dname
繼承了pname
,所以dname
協議不僅含有乙個
descript
方法還含有
name
屬性,所以遵從
dname
協議的類必須有
name
屬性和descript
方法五、協議合成
protocol named}protocol aged
}struct person: named, aged
}let birthdayperson = person(name: "malcolm", age: 21)
解釋:方法傳入的引數是
<
named
, aged
>
合成協議型別,這時能夠傳入遵從這2個協議的結構體的例項
注意:協議合成並非生成乙個新協議。而是多個協議合成乙個暫時協議,超出範圍後就會失效
Swift 學習筆記 協議
如果類含有父類,則應當將父類放在所有的協議之前。協議 protocol oneprotocol或者 var argumentone int 唯讀 var argumenttwo int 讀寫 static var argumentclass int 類 class person oneprotoco...
Swift學習筆記(二十六) 擴充套件
1.擴充套件的作用 1 使用擴充套件新增屬性 2 使用擴充套件新增方法,可變方法 3 使用擴充套件新增構造器 4 使用擴充套件新增下標 5 使用擴充套件新增巢狀型別 2.擴充套件的特性 1 使用擴充套件新增屬性,方法,可變方法,構造器,下標,巢狀型別 2 可以使乙個已有型別符合乙個或者多個協議 3 ...
Swift學習筆記 協議擴充套件
在swift中進行物件導向程式設計時,盡量使用協議和泛型,而不是類繼承,因為過深的繼承層次很容易讓 充滿難以理解的類。前面我們介紹過了類的擴充套件,協議的擴充套件也是類似的,協議擴充套件可以新增現有的計算屬性和方法,不能新增儲存屬性。擴充套件不會增加協議的需求。下面的 中,所有實現worker協議的...