Swift中的協(xié)議(protocol)學(xué)習(xí)教程
一、引言
協(xié)議約定了一些屬性與方法,其作用類似Java中的抽象類,Swift中類型通過遵守協(xié)議來實(shí)現(xiàn)一些約定的屬性和方法。Swift中的協(xié)議使用protocol關(guān)鍵字來聲明。Swift中的協(xié)議還有一個十分有意思的特性,協(xié)議可以通過擴(kuò)展來實(shí)現(xiàn)一些方法和附加功能。
二、在協(xié)議中定義屬性和方法
協(xié)議中定義的屬性只約定名稱和類型,在具體類型的實(shí)現(xiàn)中,其可以是存儲屬性也可以是計(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)時,這個屬性必須是可讀可寫的,但是如果協(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é)議中也可以對構(gòu)造方法進(jìn)行定義約定。
三、協(xié)議的特點(diǎn)
協(xié)議中雖然沒有任何屬性和方法的實(shí)現(xiàn),但是其仍然可以當(dāng)做類型來使用,在函數(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é)議作為類型這種用法另一個應(yīng)用點(diǎn)是在集合類型中,協(xié)議可以作為所有遵守此協(xié)議的集合類型。
協(xié)議可以像其他類型一樣進(jìn)行繼承,子協(xié)議將自動擁有父協(xié)議約定的屬性和方法。協(xié)議也可以通過class關(guān)鍵字來定義只有類可以進(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é)議還有一個十分重要的特性,其可以通過擴(kuò)展來進(jìn)行屬性、方法以及下標(biāo)的實(shí)現(xiàn)。這對于一些通用類的方法十分方便,這相當(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利用format函數(shù)實(shí)現(xiàn)對齊打印(左對齊、右對齊與居中對齊)
format是字符串內(nèi)嵌的一個方法,用于格式化字符串,下面這篇文章主要給大家介紹了關(guān)于Python利用format函數(shù)實(shí)現(xiàn)對齊打印(左對齊、右對齊與居中對齊)的相關(guān)資料,需要的朋友可以參考下2022-04-04
Python中使用異常處理來判斷運(yùn)行的操作系統(tǒng)平臺方法
這篇文章主要介紹了Python中使用異常處理來判斷運(yùn)行的操作系統(tǒng)平臺方法,這個方法比較新穎,,需要的朋友可以參考下2015-01-01
基于Python數(shù)據(jù)結(jié)構(gòu)之遞歸與回溯搜索
今天小編就為大家分享一篇基于Python數(shù)據(jù)結(jié)構(gòu)之遞歸與回溯搜索,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
pytorch 實(shí)現(xiàn)凍結(jié)部分參數(shù)訓(xùn)練另一部分
這篇文章主要介紹了pytorch 實(shí)現(xiàn)凍結(jié)部分參數(shù)訓(xùn)練另一部分,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

