協議是為方法、屬性等定義一套規範,沒有具體的實現。類,結構體或列舉型別都可以遵循協議,並提供具體實現來完成協議定義的方法和功能。
基本語法
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...