2017-10-06 19 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

私はそれも表示されません。プロトコルを実際に表示したい場合は、最後の2つのコード行を次のように置き換えます。

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イヌおよびヒトがイヌおよびヒトの両方が歩くする機能を持っていることを意味プロトコル・ウォーカー、に従います。しかし、実装は異なる可能性があります。

+1

あなたの答えは、なぜプロトコルが有用であるかを明確にしていません。あなたの答えでは、プロトコルについて全く理由はありません。 – rmaddy

関連する問題