協議約定了一些屬性與方法,其做用相似Java中的抽象類,Swift中類型經過遵照協議來實現一些約定的屬性和方法。Swift中的協議使用protocol關鍵字來聲明。Swift中的協議還有一個十分有意思的特性,協議能夠經過擴展來實現一些方法和附加功能。javascript
協議中定義的屬性只約定名稱和類型,在具體類型的實現中,其能夠是存儲屬性也能夠是計算屬性,協議中還須要指定屬性是可讀的仍是可讀可寫的。示例代碼以下:java
protocol MyPortocol { //定義實例屬性 //可讀的 var name:String{get} //可讀可寫的 var age:Int{set get} //可讀的 var nameAndAge:String{get} static var className:String{get} } class MyClass: MyPortocol { var name: String var age: Int var nameAndAge: String{ get{ return "\(name)"+"\(age)" } } static var className: String{ get{ return "MyClass" } } init(){ name = "HS" age = 24 } }
有一點須要注意,協議中的可讀並非只讀,協議中的屬性約定成可讀可寫,則在實現時,這個屬性必須是可讀可寫的,可是若是協議中約定成可讀的,則此屬性能夠是隻讀的也能夠是可讀可寫的,看具體的實現。函數
協議中約定的方法能夠是實例方法也能夠是類型方法,示例以下:spa
protocol MyPortocol { func logName() static func logClassName() } class MyClass: MyPortocol { var name: String var age: Int init(){ name = "HS" age = 24 } func logName() { print(name) } static func logClassName() { print(className) } }
一樣,協議中也能夠對構造方法進行定義約定。code
協議中雖然沒有任何屬性和方法的實現,可是其仍然能夠當作類型來使用,在函數參數、返回值中應用普遍,示例以下:繼承
protocol MyPortocol { //定義實例屬性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() static func logClassName() } //將協議類型做爲參數 func test(param:MyPortocol) { param.logName() }
協議做爲類型這種用法另外一個應用點是在集合類型中,協議能夠做爲全部遵照此協議的集合類型。ip
協議能夠像其餘類型同樣進行繼承,子協議將自動擁有父協議約定的屬性和方法。協議也能夠經過class關鍵字來定義只有類能夠進行遵照,示例以下:get
protocol MyPortocol { //定義實例屬性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() static func logClassName() } //只有類能夠繼承此協議 protocol MySubPortocol:class,MyPortocol { }
協議既然能夠像其餘類型同樣進行使用,固然它也可使用is,as?,as!進行檢查和轉換,關於is,as的更多用法能夠查看Swift關於類型轉換的內容。it
協議也可定義其中的屬性或方法爲可選的,即遵照此協議的類能夠實現也能夠不實現可選的屬性和方法,然而,聲明爲可選的須要此協議爲@objc類型的,示例以下:io
@objc protocol MyPortocol { //定義實例屬性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() //可選實現 optional static func logClassName() }
Swift中的協議還有一個十分重要的特性,其能夠經過擴展來進行屬性、方法以及下標的實現。這對於一些通用類的方法十分方便,這至關於全部繼承此協議的類都默認實現了這樣的方法,示例以下:
protocol MyPortocol { //定義實例屬性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() static func logClassName() } extension MyPortocol{ var name:String{ return "HS" } }
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592