Swift學習筆記十六 協議

2021-09-08 11:42:07 字數 3100 閱讀 4476

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協議的...