2017-10-06 66 views
0

小糊塗我碰到這個例子在這裏斯威夫特:爲什麼協議是有用的在這種情況下

protocol Barker { 
    func bark() 
} 

class GermanShephard: Barker { 
    func bark() { 
     print("Bark") 
    } 
} 

class BelgianMalinois: Barker { 
    func bark() { 
     print("Bark!") 
    } 
} 

let dog = BelgianMalinois() 
dog.bark() 

我知道它是如何工作的。但是,我不知道這樣做的好處。您可以刪除協議並仍然得到相同的結果。任何解釋都會有用。我知道使用協議的委託對於從一個對象向另一個對象發送消息很有用。這很有用,因爲任何對象都可以繼承委託。所以像UITableView這樣的庫不必引用你的對象來發送消息給它。

回答

1

在您的簡單示例中不需要該協議。但是,讓我們擴大你的例子:

func handleBarkingDog(_ barker: Barker) { 
    barker.bark() 
} 

let dog1 = BelgianMalinois() 
let dog2 = GermanShephard() 

handleBarkingDog(dog1) 
handleBarkingDog(dog2) 

var barker: Barker = dog1 
barker = dog2 

未經協議(或基類),你將無法向兩種不同類型的狗的引用傳遞給一個通用的方法或將其分配給一個變量。

+0

謝謝,這是有道理的。由於該方法具有參數類型Barker,因此可以採用符合協議的任何對象。或者,如果您創建了類型剝皮器,則可以爲它分配一個符合協議的對象。更有意義,看起來更有用。 –

0

我也沒有看到它。如果我想展示一個協議的行動,我會用類似的東西替換最後兩條代碼行:

func tease(_ barker: Barker) { 
    barker.bark() 
} 

tease(GermanShephard()) 
tease(BelgianMalinois()) 
-1

協議可以用來定義一些共同的功能。考慮下面的例子。

protocol Walker { 
    func walk() 
} 

class Dog: Walker { 
    func walk() { 
     print("Walk with four legs") 
    } 
} 

class Human: Walker { 
    func walk() { 
     print("Walk with two legs") 
    } 
} 

let spitz = Dog() 
spitz.walk() // prints "Walks with four legs" 

let person = Human() 
human.walk() // prints "Walks with two legs" 

在上面的例子中,bpth Dog和Human符合協議Walker,這意味着狗和人都有走路的特徵。但是,實施可能會有所不同。

+1

你的回答並不能說明爲什麼協議有用。在你的答案中,協議沒有任何理由。 – rmaddy