Swift中的協(xié)議(protocol)學(xué)習(xí)教程
一、引言
協(xié)議約定了一些屬性與方法,其作用類似Java中的抽象類,Swift中類型通過遵守協(xié)議來實現(xiàn)一些約定的屬性和方法。Swift中的協(xié)議使用protocol關(guān)鍵字來聲明。Swift中的協(xié)議還有一個十分有意思的特性,協(xié)議可以通過擴展來實現(xiàn)一些方法和附加功能。
二、在協(xié)議中定義屬性和方法
協(xié)議中定義的屬性只約定名稱和類型,在具體類型的實現(xiàn)中,其可以是存儲屬性也可以是計算屬性,協(xié)議中還需要指定屬性是可讀的還是可讀可寫的。示例代碼如下:
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 } }
有一點需要注意,協(xié)議中的可讀并不是只讀,協(xié)議中的屬性約定成可讀可寫,則在實現(xiàn)時,這個屬性必須是可讀可寫的,但是如果協(xié)議中約定成可讀的,則此屬性可以是只讀的也可以是可讀可寫的,看具體的實現(xiàn)。
協(xié)議中約定的方法可以是實例方法也可以是類型方法,示例如下:
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) } }
同樣,協(xié)議中也可以對構(gòu)造方法進行定義約定。
三、協(xié)議的特點
協(xié)議中雖然沒有任何屬性和方法的實現(xiàn),但是其仍然可以當做類型來使用,在函數(shù)參數(shù)、返回值中應(yīng)用廣泛,示例如下:
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() } //將協(xié)議類型作為參數(shù) func test(param:MyPortocol) { param.logName() }
協(xié)議作為類型這種用法另一個應(yīng)用點是在集合類型中,協(xié)議可以作為所有遵守此協(xié)議的集合類型。
協(xié)議可以像其他類型一樣進行繼承,子協(xié)議將自動擁有父協(xié)議約定的屬性和方法。協(xié)議也可以通過class關(guān)鍵字來定義只有類可以進行遵守,示例如下:
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() } //只有類可以繼承此協(xié)議 protocol MySubPortocol:class,MyPortocol { }
協(xié)議既然可以像其他類型一樣進行使用,當然它也可以使用is,as?,as!進行檢查和轉(zhuǎn)換,關(guān)于is,as的更多用法可以查看Swift關(guān)于類型轉(zhuǎn)換的內(nèi)容。
協(xié)議也可定義其中的屬性或方法為可選的,即遵守此協(xié)議的類可以實現(xiàn)也可以不實現(xiàn)可選的屬性和方法,然而,聲明為可選的需要此協(xié)議為@objc類型的,示例如下:
@objc protocol MyPortocol { //定義實例屬性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() //可選實現(xiàn) optional static func logClassName() }
Swift中的協(xié)議還有一個十分重要的特性,其可以通過擴展來進行屬性、方法以及下標的實現(xiàn)。這對于一些通用類的方法十分方便,這相當于所有繼承此協(xié)議的類都默認實現(xiàn)了這樣的方法,示例如下:
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" } }
相關(guān)文章
Python利用format函數(shù)實現(xiàn)對齊打印(左對齊、右對齊與居中對齊)
format是字符串內(nèi)嵌的一個方法,用于格式化字符串,下面這篇文章主要給大家介紹了關(guān)于Python利用format函數(shù)實現(xiàn)對齊打印(左對齊、右對齊與居中對齊)的相關(guān)資料,需要的朋友可以參考下2022-04-04Python中使用異常處理來判斷運行的操作系統(tǒng)平臺方法
這篇文章主要介紹了Python中使用異常處理來判斷運行的操作系統(tǒng)平臺方法,這個方法比較新穎,,需要的朋友可以參考下2015-01-01基于Python數(shù)據(jù)結(jié)構(gòu)之遞歸與回溯搜索
今天小編就為大家分享一篇基于Python數(shù)據(jù)結(jié)構(gòu)之遞歸與回溯搜索,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02pytorch 實現(xiàn)凍結(jié)部分參數(shù)訓(xùn)練另一部分
這篇文章主要介紹了pytorch 實現(xiàn)凍結(jié)部分參數(shù)訓(xùn)練另一部分,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03