Swift中的協(xié)議(protocol)學(xué)習(xí)教程
一、引言
協(xié)議約定了一些屬性與方法,其作用類似Java中的抽象類,Swift中類型通過(guò)遵守協(xié)議來(lái)實(shí)現(xiàn)一些約定的屬性和方法。Swift中的協(xié)議使用protocol關(guān)鍵字來(lái)聲明。Swift中的協(xié)議還有一個(gè)十分有意思的特性,協(xié)議可以通過(guò)擴(kuò)展來(lái)實(shí)現(xiàn)一些方法和附加功能。
二、在協(xié)議中定義屬性和方法
協(xié)議中定義的屬性只約定名稱和類型,在具體類型的實(shí)現(xiàn)中,其可以是存儲(chǔ)屬性也可以是計(jì)算屬性,協(xié)議中還需要指定屬性是可讀的還是可讀可寫的。示例代碼如下:
protocol MyPortocol {
//定義實(shí)例屬性
//可讀的
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
}
}
有一點(diǎn)需要注意,協(xié)議中的可讀并不是只讀,協(xié)議中的屬性約定成可讀可寫,則在實(shí)現(xiàn)時(shí),這個(gè)屬性必須是可讀可寫的,但是如果協(xié)議中約定成可讀的,則此屬性可以是只讀的也可以是可讀可寫的,看具體的實(shí)現(xiàn)。
協(xié)議中約定的方法可以是實(shí)例方法也可以是類型方法,示例如下:
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é)議中也可以對(duì)構(gòu)造方法進(jìn)行定義約定。
三、協(xié)議的特點(diǎn)
協(xié)議中雖然沒(méi)有任何屬性和方法的實(shí)現(xiàn),但是其仍然可以當(dāng)做類型來(lái)使用,在函數(shù)參數(shù)、返回值中應(yīng)用廣泛,示例如下:
protocol MyPortocol {
//定義實(shí)例屬性
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é)議作為類型這種用法另一個(gè)應(yīng)用點(diǎn)是在集合類型中,協(xié)議可以作為所有遵守此協(xié)議的集合類型。
協(xié)議可以像其他類型一樣進(jìn)行繼承,子協(xié)議將自動(dòng)擁有父協(xié)議約定的屬性和方法。協(xié)議也可以通過(guò)class關(guān)鍵字來(lái)定義只有類可以進(jìn)行遵守,示例如下:
protocol MyPortocol {
//定義實(shí)例屬性
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é)議既然可以像其他類型一樣進(jìn)行使用,當(dāng)然它也可以使用is,as?,as!進(jìn)行檢查和轉(zhuǎn)換,關(guān)于is,as的更多用法可以查看Swift關(guān)于類型轉(zhuǎn)換的內(nèi)容。
協(xié)議也可定義其中的屬性或方法為可選的,即遵守此協(xié)議的類可以實(shí)現(xiàn)也可以不實(shí)現(xiàn)可選的屬性和方法,然而,聲明為可選的需要此協(xié)議為@objc類型的,示例如下:
@objc protocol MyPortocol {
//定義實(shí)例屬性
var name:String{get}
var age:Int{set get}
var nameAndAge:String{get}
static var className:String{get}
func logName()
//可選實(shí)現(xiàn)
optional static func logClassName()
}
Swift中的協(xié)議還有一個(gè)十分重要的特性,其可以通過(guò)擴(kuò)展來(lái)進(jìn)行屬性、方法以及下標(biāo)的實(shí)現(xiàn)。這對(duì)于一些通用類的方法十分方便,這相當(dāng)于所有繼承此協(xié)議的類都默認(rèn)實(shí)現(xiàn)了這樣的方法,示例如下:
protocol MyPortocol {
//定義實(shí)例屬性
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如何對(duì)圖像補(bǔ)全并分割成多塊補(bǔ)丁
這篇文章主要介紹了Python如何對(duì)圖像補(bǔ)全并分割成多塊補(bǔ)丁,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Python文件讀取read()?readline()?readlines()函數(shù)使用場(chǎng)景技巧示例
這篇文章主要介紹了Python文件讀取read() readline()及readlines()函數(shù)使用場(chǎng)景技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Python通過(guò)Pygame繪制移動(dòng)的矩形實(shí)例代碼
這篇文章主要介紹了Python通過(guò)Pygame繪制移動(dòng)的矩形實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Python實(shí)現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫(huà)
這篇文章主要介紹了Python實(shí)現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫(huà),要將圖片轉(zhuǎn)換為字符圖其實(shí)很簡(jiǎn)單,我們首先將圖片轉(zhuǎn)換為灰度圖像,這樣圖片的每個(gè)像素點(diǎn)的顏色值都是0到255,然后我們選用一些在文字矩形框內(nèi)占用面積從大到小的ASCII碼字符2022-08-08

