2016-05-17 9 views
6

同じ結果で、スウィフトにプロトコルの適合性を実装するとき、私は2つのオプションがあります。Swiftプロトコルを実装する場所は?

  • は、クラス内のプロトコルを実装する - つまり、クラス定義の先頭に準拠を述べる、および実装を置きますまたは
  • 拡張子でプロトコルを実装します。つまり、完全にクラス外のコードアッププロトコルに準拠しています。

ここでは一例です:スウィフト冊で

class MyClass { 
    ... // Something 
} 
extension MyClass : CustomDebugStringConvertible { 
    public var debugDescription: String { 
     return "MyClass" 
    } 
} 

コードサンプルは、最初のアプローチに集中する傾向がある

public class MyClass : CustomDebugStringConvertible { 
    ... // Something 
    public var debugDescription : String { 
     return "MyClass" 
    } 
} 

対; Apple's source code of Swift coreは、2番目のアプローチ(例としてBoolOptionalを参照)のみを使用していることを示しています。

状況に応じて2つのアプローチのどちらを決定するか、または単純にコーディング設定の問題ですか?

+2

これは純粋に優先事項であり、したがって意見の問題です。個人的に私はほとんど常に後者をしますが、必ずしもそうではありません。ここの拡張に関するコメントも参照してください:http://www.apeth.com/swiftBook/ch04.html#_extending_object_types – matt

答えて

4

これは、コードの優先度と可読性の問題です。あなたのクラスが巨大になると思うなら、クラスにクラスターを追加しないようにメソッドをエクステンションに実装する方が意味があるかもしれません。短いクラスの場合は、可読性があまり影響を受けないため、すべてを1つにするといいでしょう。

4

私はそれを主にコーディングの好みと見ます。ここのチームでは、第2のアプローチを採用し始めました。私はそれが延長の奇妙な使用だと思ったが、私はそれが好きになった。それは、プロトコルの実装されたメソッドをうまくまとめて保持し、クラス自体がより小さいという印象を与えます(実際には光学のみ)。クラスにテーブルビューがあり、データソースとデリゲートを実装するためにエクステンションを使用すると、いくつかの複雑さや混乱の機会が見えます。誰かがそのクラスをサブクラス化すると、その拡張機能を認識せずに予期しない動作が発生する可能性があります。

関連する問題