協議和擴展是可以結合使用的,可以通過擴展使已有的類型采納某個協議,也可以對現有協議進行擴展。
一、通過擴展采納協議
不論是否能夠訪問一個已有類型的源代碼,都可以通過擴展使該類型采納或實現某個協議,以增加該類型的功能。
protocol Name{
var name: String{get}
}
class Animal{
var legs:Int = 4
}
extension Animal : Name{
var name: String{
return "Animal"
}
}
let ani = Animal()
print(ani.name)
控制臺:
Animal
tips:當一個類型符合了某個協議的所有要求,確還沒有聲明采納該協議,類型并不會自動采納協議,此時可以通過一個空擴展來采納協議。
eg. extension Animal:Name{}
二、協議擴展
//協議可以通過擴展來為采納協議的類型提供屬性、方法及下表腳本的實現。這樣可以基于協議本身來實現這些功能,而無需在每個采納協議的類型中都重復同樣的實現。很強大
protocol Animal{
var name:String{get set}
}
extension Animal{
func run(){
print("I am running")
}
}
class Dog : Animal{
var name:String = "Animal"
}
let dog = Dog()
dog.run()
控制臺:
I am running