2016-05-17 7 views
6

Ich habe zwei Optionen, wenn Protokollkonformität in Swift, mit dem gleichen Endergebnis Umsetzung:Wo Swift-Protokolle implementieren?

  • das Protokoll innerhalb der Klasse implementieren - das heißt, Zustand die Konformität an der Spitze der Klassendefinition und Umsetzung setzen innerhalb der Klasse Körper oder
  • Implementieren Sie das Protokoll in einer Erweiterung - das heißt, Code-up-Protokoll-Konformität völlig außerhalb der Klasse. Hier

ist ein Beispiel:

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

gegen

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

Codebeispiele in Swift Büchern auf dem ersten Ansatz konzentrieren neigen; Apple's source code of Swift core zeigt, dass sie nur den zweiten Ansatz verwenden (siehe Bool und Optional für ein Beispiel).

Gibt es einen fundierten Weg, zwischen den beiden Ansätzen situationsabhängig zu entscheiden, oder ist es nur eine Frage der Programmierpräferenz?

+2

Es ist eine Frage der Präferenz, und ist daher eine Frage der Meinung. Persönlich mache ich fast immer Letzteres, aber nicht unbedingt immer. Siehe auch meine Kommentare zu Erweiterungen hier: http://www.apeth.com/swiftBook/ch04.html#_extending_object_types – matt

Antwort

4

Es ist mehr eine Frage der Codierung Präferenz und Lesbarkeit. Wenn Sie der Meinung sind, dass Ihre Klasse ein Riese sein wird, ist es vielleicht sinnvoller, sie in einer Erweiterung zu implementieren, so dass ihre Methoden Ihrer Klasse keine Unordnung hinzufügen. Wenn es eine kurze Klasse ist, würde ich alles in einem sagen, weil Lesbarkeit weniger betroffen ist.

4

Ich sehe es meist als Kodierungspräferenz. In meinem Team haben wir begonnen, den zweiten Ansatz zu übernehmen. Zuerst dachte ich, es wäre ein merkwürdiger Gebrauch von Erweiterung, aber ich bin gekommen, um es zu mögen. Es hält die implementierten Methoden eines Protokolls gut zusammen und erweckt den Eindruck, dass die Klasse selbst kleiner ist (nur Optik wirklich). Ich könnte einige Komplikationen oder Möglichkeiten für Verwirrung sehen, wenn sagen, dass die Klasse eine Tabellenansicht hat und Sie Erweiterungen verwenden, um die Datenquelle zu implementieren und zu delegieren. Wenn jemand dann diese Klasse unterklassifiziert, ist ihnen die Erweiterung möglicherweise nicht bekannt und sie sehen ein unerwartetes Verhalten.