1.swift協(xié)議的應(yīng)用環(huán)境
? ? ? ?在Swift中蘋果技術(shù)團(tuán)隊(duì)將protocol這種語(yǔ)法發(fā)揮的更加深入和徹底。Swift中的protocol不僅能定義方法還能定義屬性,配合extension擴(kuò)展的使用還能提供一些方法的默認(rèn)實(shí)現(xiàn),而且不僅類可以遵循協(xié)議,現(xiàn)在的枚舉和結(jié)構(gòu)體也能遵循協(xié)議了。希望能給Swift開(kāi)發(fā)的小伙伴們了解的更透徹。
2.協(xié)議的定義
? ? (官方文檔)指出,協(xié)議為方法、屬性、以及其他特定的任務(wù)需求或功能定義藍(lán)圖。協(xié)議可被類、結(jié)構(gòu)體、或枚舉類型采納以提供所需功能的具體實(shí)現(xiàn)。滿足了協(xié)議中需求的任意類型都叫做遵循了該協(xié)議
協(xié)議中定義屬性
protocol?Student?{
//可讀可寫的屬性
varname:?String?{?get?set?}
//可讀屬性
varbirthPlace:?String?{?get?}
}.
struct?Puple:?Student?{
var name:?String
var birthPlace:?String?="北京"
}
var p1?=?Puple(name:"小明",?birthPlace:"上海")//實(shí)例中的屬性同樣可以被修改.但會(huì)不會(huì)有疑問(wèn)?明明是只讀的屬性,為什么能修改了。 ?注意 ? ?協(xié)議中的“只讀”屬性修飾的是協(xié)議這種“類型“”的實(shí)例 如果還不理解就創(chuàng)建個(gè)對(duì)象比對(duì)就可以領(lǐng)會(huì)。
協(xié)議中定義方法
protocol?Student?{
//類方法static?func?study()//實(shí)例方法func?changeName()}
struct?CollageStudent:?Student?{
//類方法實(shí)現(xiàn)
static?func?study()?{}//實(shí)例方法實(shí)現(xiàn)
func?changeName()?{}}
//方法的調(diào)用
CollageStudent.study()
var c1?=?CollageStudent() ?c1.changeName()
注意:當(dāng)我們?cè)诮Y(jié)構(gòu)體中的方法修改到屬性的時(shí)候需要在方法前面加上關(guān)鍵字mutating表示該屬性能夠被修改。而name屬性也可讀可寫,不然也就沒(méi)意義了不是。
協(xié)議中的初始化器
protocol?Pet?{
init(name:?String)
}
class?Cat:?Pet?{
varname:?String?="Cat"
required?init(name:?String)?{
self.name?=?name
}}//Cat由于遵循了Pet協(xié)議,應(yīng)該用required關(guān)鍵字修飾初始化器的具體實(shí)現(xiàn)
注意:Swift中類的繼承是單一的,但是類可以遵守多個(gè)協(xié)議,因此為了突出其單一父類的特殊性,我們應(yīng)該將繼承的父類放在最前面,將遵守的協(xié)議依次放在后面。
.多個(gè)協(xié)議重名方法調(diào)用沖突(解決呀)
protocol?TextOne?{func?text()?->?Int}
protocol?TextTwo?{func?text()?->?String}
同時(shí)繼承這倆個(gè)類
struct?Person:?TextOne,?TextTwo?{
func?text()?->?Int?{return10}
func?text()?->?String?{return"hello"}}
let?p1?=?Person()
//嘗試調(diào)用返回值為Int的方法
let?num?=?p1.text()
//嘗試調(diào)用返回值為String的方法
let?string?=?p1.text()
調(diào)用一定是無(wú)法通過(guò)的,怎么解決,當(dāng)然一般也不會(huì)這樣設(shè)計(jì),但腦子發(fā)熱就要這樣寫怎么辦,已解決:
//嘗試調(diào)用返回值為Int的方法
let?num?=?(p1?as?TextOne).text()
//嘗試調(diào)用返回值為String的方法
let?string?=?(p1?as?TextTwo).text()
協(xié)議的繼承、聚合、關(guān)聯(lián)類型
協(xié)議可以繼承一個(gè)或者多個(gè)其他協(xié)議并且可以在它繼承的基礎(chǔ)之上添加更多要求。協(xié)議繼承的語(yǔ)法與類繼承的語(yǔ)法相似,選擇列出多個(gè)繼承的協(xié)議,使用逗號(hào)分隔
協(xié)議的聚合(這種模式小編較少使用,一方面不多見(jiàn),另一方面代碼過(guò)于復(fù)雜不便于開(kāi)發(fā)設(shè)計(jì)也不推薦,看似高大上小編認(rèn)為不夠友好)這方面的設(shè)計(jì)swift是支持的??梢宰孕蟹?。
//協(xié)議聚合成臨時(shí)的類型
typealias?Three?=?TwoProtocol?&?OneProtocol
//協(xié)議聚合成為參數(shù)的類型
func?text(paramter:?OneProtocol?&?TwoProtocol)?{
}