在Swift中協議具有強大的功能。通過拓展,不僅能在協議中添加已于方法的具體實現,還能添加新的方法。
通過協議拓展來增加代碼和繼承的優勢:
- 不需要強制繼承某一個父類。
- 可以讓已經存在的類型遵循協議。
- 協議可以用于類,也可以用于結構體和枚舉。
- 使用協議,不用在乎super方法的調用。
- 需要注意的一點,在協議中定義的方法是動態派發的,在協議拓展中實現方法(沒有在協議主體中聲明的)是靜態派發。動態派發指的是在變量具體是哪一種類型,就到具體的類型中找方法的實現(不在乎聲明變量時候 聲明的是什么類型),如果有就調用,如果沒有再去調協議拓展中的實現。靜態派發指的是 變量聲明時候指定的是哪一種類型,就到這個類型中去找方法的實現,即使它的實際類型有其他的實現,也不會去調用。
For example:
protocol Fruit{
func ripe()
}
extension Fruit{
func ripe(){
print ("Fruit ripe.")
}
func name(){
print("Fruit")
}
}
struct Banana : Fruit{
func ripe(){
print ("Banana ripe.")
}
func name(){
print("Banana")
}
}
Based on the definition, we call the methods.
let a : Fruit = Banana()
let b : Banana = Banana()
a.ripe()
b.ripe()
a.name()
b.name()
The output should be:
Banana ripe
Banana ripe
Fruit
Banana
由于name方法并沒有在協議中定義,屬于靜態派發。所以即便a的實際類型是Banana,但是并不會去調用Banana中name方法。