swift 學習記錄(協議)

2021-07-09 03:30:57 字數 2103 閱讀 2500

協議是為方法、屬性等定義一套規範,沒有具體的實現。類,結構體或列舉型別都可以遵循協議,並提供具體實現來完成協議定義的方法和功能。

基本語法

protocol 協議名稱

型別使用冒號(:) 來遵循協議,遵循多個協議時,用逗號(,)隔開

protocol 型別名:協議名1,協議名2,協議名3

對屬性的規定

協議中的通常用var來宣告屬性,在型別宣告後加上 來表示屬性是可讀可寫的,唯讀屬性則用 來表示。協議裡規定了例項屬性和靜態屬性的名稱和型別,但不指定是儲存型屬性還是計算型屬性。

在協議中定義靜態屬性(type property)時,總是使用static 關鍵字作為字首。當協議的遵循者是類時,可以使用class 或static 關鍵字來宣告類屬性,但是在協議的定義中,仍然要使用static 關鍵字。

protocol animation

var age:int

static

var hair:double

}class

person:animation

init(name :string ,age :int)

}

對方法的規定

協議可以要求其遵循者實現某些指定的例項方法或靜態方法。這些方法在協議中定義 方法名(必須)、引數列表(非必須)、返回值型別(非必須)。但是沒有方法體。

協議中定義靜態方法,不論 遵循者是什麼型別,都用static 關鍵字定義。遵循者是類時,在類中可以使用關鍵字 static 或 class 來實現。

在上面的animation 協議中加入方法:

func speed(maxspeed:int)->string
在person 類中實現方法:

func speed(maxspeed: int)->string
呼叫 speed()方法

var person = person(name: "張三", age: 20)

var speed = person.speed(10)

print(speed)

//張三 maxspeed is 10km/h

對構造器的規定

協議裡可以構造器。用init命名。有引數列表,沒有方法體。

類中實現 協議裡的 構造器 ,必須使用 關鍵字 required

在anmation 協議中加入 構造器:

init(name

:string,age

:int)

在person 中實現構造器

required init(name :string ,age :int)
使用required 修飾符可以保證:所有的遵循該協議的子類,同樣能為構造器規定提供乙個顯式的實現或繼承實現。

如果乙個子類重寫了父類的指定構造器,並且該構造器遵循了某個協議的規定,那麼該構造器的實現需要被同時標示required 和override 修飾符

protocol animation

class person

}class boy:person,animation

}var boy = boy(name: "張三", age: 50)

對mutating方法的規定

協議中依然使用關鍵字 mutating 定義變異方法。

protocol figure

var y:int

mutating func movex(deltax:int,deltay:int)

}struct point:figure

}var point = point(x: 10, y: 10) //x = 10,y = 10

point.movex(30, deltay: 30) //x = 30 y = 30

swift學習記錄(Optional)

對swift語法的陌生主要 於兩個地方,乙個是區別於其他語言的語法形式,比如c 中的int i 與swift中的var i int 另外乙個是語法的功能,swift中的語法功能千奇百怪。從這篇文章開始,主要通過閱讀與搜尋the swift programing language 來學習,記錄學習過程...

swift學習記錄(列舉)

列舉定義了乙個通用型別的一組相關值,使我們可以在 中以一種安全的方式來使用這些值。基本語法 使用 enum 關鍵字定義列舉 enum 列舉名 enum compasspoint 成員值乙個列舉中定義的值,是列舉的成員值 成員 case 關鍵字表示乙個新的成員值將被定義。列舉的成員值不會被預設賦予乙個...

swift學習記錄(擴充套件)

擴充套件就是向乙個已有的類 結構體 列舉型別或者協議型別新增新功能。基本 語法 使用關鍵字extension來宣告乙個擴充套件 extension 型別名 擴充套件可以 1 新增計算性屬性 和 靜態計算性屬性 extension double var m double var cm double v...