面向協議編程
什么是協議 (Protocol)
協議:就是一組屬性/方法的定義胚宦。
某個類要遵守一個協議张峰,就要實現這個協議所定義的這些內容瘾带。協議所走的事情就是“關于實現的約定”沟堡。
1.定義一個協議:
protocol Greetable {
// 協議屬性
var name: String { get }
// 協議方法
func doWork()
}
2.遵守并實現協議的約定
// 遵守協議
class Person: Greetable {
var name: String = "Person"
func doWork() {
print("擼代碼了")
}
}
class Dog: Greetable {
var name: String = "dog"
func doWork() {
print("吃屎了")
}
}
3.遵守并實現協議的屬性和方法后悄谐,就可以直接使用協議的屬性和方法
let person = Person()
print(person.name)
person.doWork()
let dog = Dog()
print(dog.name)
dog.doWork()
輸出結果:
Paste_Image.png
協議的默認實現(swift2.0以后增加了協議的默認實現)
extension Greetable{
var name: String {
return "animal"
}
func doWork() {
print("啪啪啪")
}
}
有默認實現的協議介评,在遵守的時候可以不用再去實現屬性和方法,而可以直接去調用屬性和方法
class Cat: Greetable {
}
調用屬性和方法
let cat = Cat()
print(cat.name)
cat.doWork()
Paste_Image.png
擴展中默認實現的限定
extension Greetable where Self: Person {
var name: String {
return "animal"
}
func doWork() {
print("啪啪啪")
}
}
此時限定了協議的默認實現只能在Person
類中使用爬舰,其他類遵守協議就一定要實現協議们陆。
結論:
1.遵守協議的類就要實現協議的屬性和方法,實現之后可以直接調用情屹。
2.如果協議的屬性和方法在擴在中默認實現坪仇。遵守的類可以不必再去實現,而直接調用屬性和方法垃你。
3.協議已經默認實現椅文,遵守的類又實現了屬性和方法喂很,按照新實現的屬性和方法為準。
4.extension Protocol1 where Self: 類1 限定了協議Protocol1的擴展實現皆刺,只能由類1的對象調用