2017-02-10 5 views
1

私はSwift 3チュートリアルとドキュメンテーションに行きます。プロトコルを扱う際に誰もが使用しているデザインパターンがあることがわかります。これは、少量の変数(時には1つまたは2つ)を含むプロトコルを宣言し、このプロトコルの拡張を作成し、いくつかのメソッドを定義する拡張で始めることから始まります。例えば、(これは単なるデモンストレーションのために、本当に愚かなコードサンプルです):独自のプロトコルを拡張するのはなぜですか?

protocol Bicycle { 
    var numberOfWheels: Int {get} 
    var isMoving: Bool {get set} 
} 

extension Bicycle { 
    func startPedaling() { isMoving = true } 
    func stopPedaing() { isMoving = false } 
} 

プロトコルおよび拡張は私の完全な制御下にある(私は開発者です、と私は、このリソースファイルへのアクセス権を持っているので) 。また、両方とも同じリソースファイルに存在します。

なぜ、メソッドは元のプロトコル内ではなく、拡張内に存在しますか?例:

protocol Bicycle { 
    var numberOfWheels: Int {get} 
    var isMoving: Bool {get set} 

    func startPedaling() { isMoving = true } 
    func stopPedaing() { isMoving = false } 
} 

ありがとう、 ボリス。

+1

2番目の例はコンパイルされません。 - Lookup「デフォルトの実装を提供する」はhttps://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.htmlにあります。 –

答えて

2

あなたが提示したような場合があるかもしれませんが、それは意味をなさないかもしれませんが、独自のプロトコルへのプロトコル拡張は、場合によってはクラスを拡張する。

以下の例を想像してください。バイカクルがマウンテンバイクの場合は、「コンパス」(最善の例ではない)のようなものを追加します。次に、私は次のようにします:

protocol Bicycle { 
    var numberOfWheels: Int {get} 
    var isMoving: Bool {get set} 

extension Bicycle { 
    func startPedaling() { isMoving = true } 
    func stopPedaing() { isMoving = false } 
} 

extension Bicycle where Self: MountainBike { 
    var compass: Compass {get} 
} 

class MountainBike: Bicycle { 
    //Here you can use the compass 
} 

class NormalBike: Bicycle { 
    //Here you can't use the compass 
} 

あなたは見えますか?各クラスに特定のものを追加することができますので、プロトコルはクラスによっては若干調整できます。今度はMountainBikeから継承するすべてのクラスがコンパスを使用できます。

この場合、それは簡単に方法かもしれないと利益はそのCLASEではありませんが、そのような

protocol Controller { 
    //some useful variables 
} 

extension Controller where Self: UIViewController { 
    // Here you can use all the properties of a UIViewController 
    // like getting the navigation controller, etc. Every 
    // UIViewController subclass (or a UIViewController itself) 
    // that conforms to it would get this methods 
} 

として、それが本当に有用であることを例が、あることがお役に立てば幸い!

関連する問題