2017-02-10 1 views
1

Ich gehe über Swift 3 Tutorials und Dokumentation, und ich sehe, dass es ein Designmuster gibt, das jeder bei der Arbeit mit Protokollen verwendet. Es beginnt damit, ein Protokoll mit einer kleinen Anzahl von Variablen zu deklarieren (manchmal nur ein oder zwei) und dann eine Erweiterung für dieses Protokoll zu erstellen und in der Erweiterung einige Methoden zu definieren. Zum Beispiel (das ist wirklich ein dummes Codebeispiel, nur zur Demonstration):Warum erweitern Sie Ihr eigenes Protokoll?

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

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

Das Protokoll und die Erweiterung ist unter meiner vollen Kontrolle (da ich bin der Entwickler, und ich habe Zugriff auf diese Ressource-Datei) . Außerdem befinden sie sich beide in derselben Ressourcendatei.

Warum befinden sich die Methoden also in der Erweiterung und nicht im ursprünglichen Protokoll? Zum Beispiel:

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

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

Danke, Boris.

+1

Ihr zweites Beispiel würde nicht kompilieren. - Suche "Bereitstellung von Standardimplementierungen" unter https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html. –

Antwort

2

Vielleicht ist es in einem Fall wie dem, den Sie vorgestellt haben, möglicherweise nicht sehr sinnvoll, aber Protokollerweiterungen zu Ihren eigenen Protokollen sind in einigen Fällen sehr mächtig, besonders wenn Sie die Einschränkungen verwenden, in denen Klasse die Erweiterung erhält .

Stellen Sie sich das folgende Beispiel vor. Ich füge hinzu, um etwas wie einen "Kompass" hinzuzufügen (nicht das beste Beispiel), wenn der Fahrrad ein Mountainbike ist. Dann würde ich folgendes tun:

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 
} 

Siehst du? Sie können jeder Klasse bestimmte Dinge hinzufügen, so dass das Protokoll für einige Klassen etwas optimiert werden kann. Jetzt kann jede Klasse, die von MountainBike erbt, den Kompass benutzen.

In diesem Fall kann es Art und Weise zu einfach sein und die Vorteile sind nicht so clase, aber es gibt Fälle, dass es wirklich nützlich sein kann, wie

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 
} 

Hoffe, es hilft!

Verwandte Themen