更新:2018.05.24
整理了一下demo:SwiftDemo
擴(kuò)展(Extension)
- Swift中携添,擴(kuò)展功能(Extension)可以動(dòng)態(tài)的給類添加功能。包括在沒有權(quán)限獲取源代碼的情況下,擴(kuò)展某個(gè)類型的功能廊谓,在OC中古沥,是通過runtime來(lái)實(shí)現(xiàn)動(dòng)態(tài)調(diào)用或動(dòng)態(tài)添加功能的。
- 現(xiàn)有的類称诗、結(jié)構(gòu)體或枚舉類型的方法萍悴,可以在擴(kuò)展的幫助下進(jìn)行添加。
- 類型的功能可以擴(kuò)展加入寓免,但不能重寫癣诱。
- 擴(kuò)展可以完成以下任務(wù):
- 添加計(jì)算型屬性和計(jì)算靜態(tài)屬性。
- 定義實(shí)例方法和類方法袜香。
- 提供新的構(gòu)造器撕予。
- 定義下標(biāo)。
- 定義和使用新的嵌套類型蜈首。
- 使一個(gè)已有類型符合某個(gè)接口实抡。
下面我們來(lái)看一個(gè)例子:
extension Int {
var double : Int {
return self * 2
}
var half : Double {
return Double(self)/2.0
}
func bigger(num : Int) -> Int {
if self <= num {
return num
} else {
return self
}
}
}
a -> 上面例子中,我們給Int類型創(chuàng)建了針對(duì)Int的擴(kuò)展欢策,具體擴(kuò)展內(nèi)容放在大括號(hào)內(nèi)吆寨,
b -> 在括號(hào)內(nèi),給Int類型添加了2個(gè)屬性踩寇,分別用于求取當(dāng)前整數(shù)類型的值的2倍和半數(shù)的值啄清。
c -> 剛開始寫時(shí)報(bào)了一個(gè)錯(cuò),Declaration is only valid at file scope
姑荷,聲明只在文件內(nèi)有效盒延,后來(lái)查了資料,發(fā)現(xiàn)鼠冕,擴(kuò)展不能寫在本類的大括號(hào)內(nèi)添寺,要寫在大括號(hào)外,就可以了懈费。
d -> 后面有添加了一個(gè)擴(kuò)展方法 bigger 比較兩個(gè)數(shù)字大小计露,下面我們來(lái)調(diào)用一下。
let num:Int = 1
print(num.double)
print(num.half)
print(num.bigger(num: 2))
#輸出
2
0.5
2
e -> 可以看到,我們調(diào)用的時(shí)候也很方便票罐。
協(xié)議(protocol)
- 協(xié)議是為方法叉趣、屬性定義的一套規(guī)范,沒有具體實(shí)現(xiàn)该押。
- 協(xié)議可以通過一個(gè)類疗杉、結(jié)構(gòu)體、枚舉來(lái)提供協(xié)議中要求的具體實(shí)現(xiàn)蚕礼。類烟具、結(jié)構(gòu)體或枚舉都可以遵循協(xié)議,并提供具體實(shí)現(xiàn)來(lái)完成協(xié)議定義的方法和功能奠蹬。
下面我們來(lái)定義一個(gè)協(xié)議:(和擴(kuò)展一樣朝聋,要寫在本類的大括號(hào)外)
protocol Walking {
func walk()
}
a -> 我們定義了一個(gè)Walking的協(xié)議,里面有一個(gè)方法walk囤躁。
先不著急看實(shí)現(xiàn)冀痕,先看一下協(xié)議的繼承。
protocol Runing:Walking {
var velocity:Double{get set}
func run()
}
b -> 這是一個(gè)繼承與Walking的協(xié)議Runing狸演,并添加了屬性velocity和方法run言蛇。協(xié)議能繼承一個(gè)或多個(gè)其他協(xié)議,多個(gè)協(xié)議之間用,
分隔開严沥。
然后我們來(lái)看在類中實(shí)現(xiàn)協(xié)議
- 要使哪個(gè)類遵循某一協(xié)議猜极,需要在類名后面添加協(xié)議名稱,并用
:
分隔開消玄,作為類型定義的一部分跟伏。 - 當(dāng)遵循多個(gè)協(xié)議時(shí),多個(gè)協(xié)議之間用
,
進(jìn)行分隔翩瓜。
為了更方便演示受扳,我們?cè)谏厦娴睦又性诙嗉右粋€(gè)協(xié)議。
protocol Walking {
func walk()
}
protocol Runing:Walking {
var velocity:Double{get set}
func run()
}
protocol Eating {
func eat()
}
c -> 上面的例子中兔跌,多加了一個(gè)Eating協(xié)議勘高,然后我們定義一個(gè)類,去實(shí)現(xiàn)這些協(xié)議坟桅。
class People:Runing,Eating {
var velocity: Double = 2.0
func walk() {
print("I`m walking")
}
func run() {
print("I`m runing")
}
func eat() {
print("I`m eating")
}
}
d -> 上面的類中华望,遵循了2個(gè)協(xié)議 Runing
、Eating
仅乓,而Runing
繼承自Walking
赖舟,所以也要實(shí)現(xiàn)Walking
的方法。如果協(xié)議沒有實(shí)現(xiàn)的話夸楣,系統(tǒng)會(huì)報(bào)錯(cuò)宾抓。People
中子漩,實(shí)現(xiàn)了協(xié)議中的屬性velocity
,實(shí)現(xiàn)的時(shí)候會(huì)發(fā)現(xiàn)是有自動(dòng)提示的石洗,然后實(shí)現(xiàn)了三個(gè)協(xié)議中的方法幢泼。
然后,我們到viewDidLoad中去調(diào)用一下協(xié)議的方法讲衫,類似于OC中的delegate缕棵,調(diào)用協(xié)議中的方法,實(shí)現(xiàn)協(xié)議方法的類就會(huì)自動(dòng)執(zhí)行協(xié)議方法焦人。
var people3 = Peoples()
print(people3.velocity)
people3.eat()
people3.run()
people3.walk()