Swift 二十一 協議 1

2021-07-07 05:24:26 字數 3561 閱讀 2816

1、swift入門學習筆記(第一版),對swift的基礎知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文件為準~

2、在學習完基本的知識點以後會結合官方文件及相關資料,在此版本的基礎上進行新增更改。

類、結構體或列舉型別可遵循協議,並提供具體實現完成協議定義的方法和功能。

除了遵循協議,我們也可對協議進行擴充套件,實現一些特殊規定或一些附加功能

定義協議

protocol someprotocol
結構體遵循多個協議

struct somestructure: firstprotocol, anotherprotocol
類繼承父類,同時遵循協議,父類放在協議之前

class

someclass: somesuperclass, firstprotocol, anotherprotocol

協議可以規定遵循者提供特定名稱和型別的例項屬性或類屬性,必須指明唯讀還是可讀可寫

協議要求唯讀,屬性可以使唯讀,也可以是可讀可寫

協議要求可讀可寫,那麼屬性必須可讀可寫

型別屬性:型別本身特有,不管有多少例項,這些屬性只有唯一乙份,大家共享。類,列舉,結構體都可以有。static關鍵字。如果遵循者是類也可以用class關鍵字宣告類屬性

例項,沒有實際意義,純為了說明功能

protocol someprotocol 

var age:int

}//set和get方法是間接獲取和設定其他屬性或變數的值。set不能set本身,可以利用傳入set其他的引數

class

person1:someprotocol

var age:int

set

}}var person = person1()

person.age = 20

print(person1.name,person.borntime,person.age)

output:

zhu 1995 20
3.1、普通方法/類方法/可變引數方法

不需要大括號和方法體。不支援引數預設值。支援定義具有可變引數的方法,寫法與普通函式相同,要寫引數

類方法可用static關鍵字作為字首。如果協議遵循著是類也可以用classstatic

可變引數:表示不確定數量的輸入值,0或多個,傳入引數在函式中變為此型別陣列,乙個函式最多乙個可變引數

3.2、對mutating方法的規定

需要在函式中修改它的例項(改self),適用於值型別(結構體、列舉),mutating關鍵字

如果用類實現mutating方法時,不用寫mutating關鍵字。結構體或列舉實現時必須要寫

protocol oneprotocol 

class testtype:oneprotocol

func mutatingmethod()

static func sometypemethod()

func arithmeticmean(numbers: double...) -> double

print(total / double(numbers.count))

return total / double(numbers.count)

}}var testtype = testtype()

testtype.classmethod()

testtype.mutatingmethod()

testtype.sometypemethod()

testtype.arithmeticmean(1

,2.3

,4.56)

output:

classmethod

類實現mutating方法不用寫mutating關鍵字

sometypemethod

2.62

語法與書寫普通構造器一樣,但是不需要寫花括號和構造器的實體

protocol anotherprotol 

//普通類遵循協議,如果不是final類(不允許繼承),需要在構造器方法前加required關鍵字

class

someclass:anotherprotol

}class

somesuperclass

}//協議規定構造器與父類的構造器一樣,那麼重寫要同時表上required和override修飾符

class

somesupclass:somesuperclass,anotherprotol

}//有final關鍵字,不允許繼承,遵循協議,正常書寫方法即可

final

class

somefinalclass:anotherprotol

}

同時可在協議中定義可失敗構造器,遵循該協議的型別必須新增同名同引數可失敗構造器或者非可失敗構造器

如果協議定義非可失敗構造器,遵循該協議的型別必須新增同名同引數的非可失敗構造器或隱式解析型別的可失敗構造器(init!)

協議本身不實現任何功能,但是可像普通型別一樣使用

a、作為函式、方法或構造器中的引數型別或返回值型別

b、作為常量、變數或屬性的型別

c、作為陣列、字典或其他容器中的元素型別

protocol otherprotocol 

class otherclass:otherprotocol

}class oneclass

func method()}

varotherval = otherclass

()var

oneval = oneclass

(function: otherval)

oneval.method

()

定義乙個oneclass類,其引數function的型別是otherprotocol,那麼所有遵循otherprotocol協議的型別的例項都可以賦值給function

otherclass遵循otherprotocol協議,可以將其實例賦值給function

output:

~~otherclass~~

Swift 學習之二十一 ?和 !(詳解)

swift語言使用var定義變數,但和別的語言不同,swift裡不會自動給變數賦初始值,也就是說變數不會有預設值,所以要求使用變數之前必須要對其初始化 如果在使用變數之前不進行初始化就會報錯 plain view plain copy print var stringvalue string err...

Swift學習筆記 二十一 下標

下標可以定義在類 結構體和列舉中,是訪問集合 表或序 中元素的快捷方式。可以使用下標的索引,設定和獲取值,而 需要再呼叫對應的訪問方法。舉例來說,下標訪問乙個 array 實 中的元素可以寫作 somearray index 訪問 dictionary 實 中的元素可以寫作 somedictiona...

Python Signal 訊號 (二十一)

常用訊號型別sigint 終止程序 中斷程序,不可通過signal.signal 捕捉 相當於ctrl c sigterm 終止程序 軟體終止訊號,可通過signal.signal 捕捉 預設訊號,當os.kill 沒有指明訊號型別時,預設的是該訊號 sigkill 終止程序 殺死程序,不可捕捉 相...