2016-12-20 4 views
1

Wenn ich eine Klasse Christmas, und ein Protokoll Merry, Christmas viele Menschen wieder in Einklang zu Merry, wäre es auf diese Weise tun:Warum fügen wir Protokollkonformität mit Erweiterungen hinzu?

class Christmas { 
    ... 
} 

extension Christmas: Merry { 
    ... 
} 

es auch von Apple gefördert wird.

Allerdings ist es nicht bequemer, nur die Klasse zu Protokoll macht anzupassen, wenn es definiert wird? Wie folgt aus:

class Christmas: Merry { 
    ... 
} 

Was ist der Unterschied zwischen den zwei Methoden?

+1

Kein großer Unterschied, der erste ist einfach ordentlich, da Ihre Root-Klasse nicht mit allen Problemen umgehen muss, die durch Protokollfunktionen verursacht werden. – rptwsthi

+1

Ich verwende es, um meine Codes sauber zu halten, indem ich die Klassenkernfunktionen in die Originaldatei lege, während alle Delegiertenmethoden in einer anderen. Auch um bestehende Klassen so zu erweitern, wie sie gemacht sind. –

+0

Mögliches Duplikat von http://stackoverflow.com/questions/36263892/extensions-in-my-own-custom-class oder http: // stackoverflow.com/questions/40502086/how-to-richtig-verwenden-class-extensions-in-swift. –

Antwort

7

Sie sind unterschiedliche Codierung machen Stile. Die erste Option

class Christmas { 
    ... 
} 

extension Christmas: Merry { 
    ... 
} 

ist sauberer, wenn Sie die gesamte Klasse betrachten. Sie können sofort alle Protokollimplementierungen sehen, denen die Klasse entspricht.

Mit der zweiten Option können Sie die Implementierung des Protokolls in der Klasse setzen es mit den Klassenmethoden zu mischen. Wenn Sie jedoch

//MARK: - 

verwenden, wird der Code nicht weniger sauber, als wenn Sie Erweiterungen verwenden. Zum Beispiel:

protocol Merry: class { 
    func celebrate() 
} 

class Cristmas: NSObject, Merry { 
    private var santa: AnyObject? 

    //MARK: - Private Methods 
    private func callSanta() { 
     //calling Santa 
    } 

    //MARK: - Merry Implementation 
    func celebrate() { 
     //celebration starts here 
    } 
} 

und wenn in der ganzen Klasse sucht man deutlich die Trennung der Protokollimplementierung sehen: enter image description here

Die Funktionalität beiden Optionen ist gleich.

1

Es gibt Unterschiede zwischen den Klassen und .

Zu der Zeit Ihre class zu schreiben, wusste, dass Sie dies zu Protokoll entspricht sollte, dann können Sie Klasse entspricht Protokoll verwenden. extensions sind jedoch dazu gedacht, die Funktionalität bestehender classes zu erweitern. Nachdem Sie Ihre Klasse geschrieben und für ein Jahr verwendet haben, müssen Sie der Klasse ein zusätzliches Feature hinzufügen. Anstatt die Klasse zu ändern, können Sie einfach die Klasse erweitern. Erweiterung ist nicht nur für Ihre Klassen, Sie können das Verhalten jeder Klasse für Sie erweitern (native Frameworks, Bibliotheken von Drittanbietern).

0

Es gibt einen kleinen Unterschied. Der erste bestätigt das Protokoll wie erwartet. Coming to zweiten, das auch zu Protokoll und zusätzlich zu den Methoden Schreiben in Erweiterungen

extension Christmas: Merry { 
    ... 
} 

wie dies bestätigt, wird diese Methoden zur Verfügung, durch out-Projekt mit dem Klassennamen „Weihnachten“

+0

Ich verstehe es nicht, meinst du die erste Methode nicht "machen diese Methoden durch Out-Projekt mit der Klasse Name" Weihnachten ""? –

+0

ja. Für ein Beispiel, das eine Erweiterung für die String-Klasse erstellt, werden diese Methoden für alle String-Klassenobjekte im gesamten Projekt verfügbar. –

Verwandte Themen