2017-09-29 11 views
1

今日は少し失われてしまったので、今日質問をします。これはSwiftとプロトコル、そしてプロトコル指向プログラミング(POP)に関するものです。スイフトでプロトコルを使用する場合

私はそれについての記事、さらには本を読んだが、私はまだ混乱している。プロトコルはすばらしいツールだと言われていますが、私はその力を本当に理解していません。

私はオブジェクトとしてのボリュームの表現であるクラスVolumeをコーディングしているので、私は質問があります。たとえば、

struct Volume { 
    var value: Float = 1 
    var isLogScale: Bool = false 
    var maxLogVolume: Float = 6.0 // value in dB 
    var maxLinearVolume: Float = 1.0 
    let dynamicRange: Float = 50.0 


    func convertLinearToLog() -> Float { 
    // Do some maths 
    } 

    func otherFunction() { 
    print("Hello, I'm the most useless function in the world.") 
    } 
} 

これは一般的なクラスではありません。

しかし...私より良い私たちのこのようなプロトコル必要があります。その後、

protocol VolumeProtocol { 
    var value: Float {get set} 
    var isLogScale: Bool {get set} 
    var maxLogVolume: Float {get set} 
    var maxLinearVolume: Float {get set} 
    let dynamicRange: Float {get} 

    func convertLinearToLog() -> Float 
    func otherFunction() 
} 

そして、私は本当にこの質問に答えるために管理するので、あなた場合はありません

struct MyVolumeClass: VolumeProtocol { 
// Same thing as before 
} 

のようなすべてのものを再実装プロトコルを使用するときに私を助けることができますし、私は感謝しません。

+1

あなたは構造体で動作するはずありませんクラス。見て分かる価値がありますhttps://developer.apple.com/videos/play/wwdc2015/408/ –

+1

@LeoDabusあなたはまったく正しいです。申し訳ありませんが、私はここでクラス/構造体について間違いを犯しました。実際、このケースは完全に構造体です。私は私の質問を編集しました。そして、リンクありがとう – DEADBEEF

+1

一般的に、プロトコルを使用するシナリオの1つは、いくつかの共通メソッド/プロパティをいくつかのクラスから抽象化したいときですが、何らかの理由で継承を使用したくない場合(クラスすでに他のクラスから継承する必要があります)。現在の実装では、このプロトコルに準拠したいくつかの異なるクラスを持つとは考えていないので、 'VolumeProtocol'を作成するのは意味がありません。 –

答えて

2

プロトコルは、このよう1ユースケースよりも多くを持っていますが、それについて考える:クラスの場合

  • を、プロトコルは、クラス階層とは別の軽量継承階層を提供します。 AnimalクラスとそのサブクラスCat、Dog、Bird、およびInsectがある場合、BirdとInsectだけがflyメソッドを共有するように指定する方法はありますか?

  • 構造体の場合、プロトコルは、さもなければ完全に欠けている継承階層を提供します。構造体にはスーパーストラクチャーがありません。したがって、構造体Birdと構造体Insectを指定した場合、それらがflyメソッドを共有することをどのように指定しますか?

さて、あなたは鳥や昆虫がちょうどflyメソッドを持って起こる、それは物語の終わりだと答えることができます。しかし、それはあなたが "flyメソッドを持つすべてのタイプ"のセットについて話す必要があるときには行いません。 の場合は、flyメソッドをのオブジェクトに送信できるようにするには、コンパイラがflyメソッドを送信できるようにするために、そのセットを記述する必要があります。

protocol Flier { 
    func fly() 
} 

今フライヤーは、タイプある:

ソリューションは、プロトコルです。フライヤーが期待されるところフライヤーに準拠する任意の型のインスタンスを使用することができ、コンパイラはあなたがflyへのフライヤーを言わせますので、問題は解決されています

var myFlier : Flier = Bird() // if Bird conforms to Flier 
myFlier.fly() // legal 
+0

私の本から取った例:http://www.apeth.com/swiftBook/ch04.html#_protocols – matt

関連する問題