2016-05-31 5 views
0

Kommen aus einem Objective-C-Hintergrund, wo jedes Protokoll immer eine Delegate-Eigenschaft haben muss. In Swift scheint das nicht der Fall zu sein, und es bricht das Paradigma, das ich über Protokolle hatte.Swift vs Objcective-C-Protokolle

AFAIK in Swift, Protokolle werden für 2 Hauptzwecke verwendet: Delegationsmuster (das einen Delegaten wie Objective-C benötigen würde) und auch Zusammensetzungsmuster (das in Objective-C nicht existierte und keinen Delegaten benötigt Eigenschaft) gekoppelt mit einer Erweiterung, die es effektiver macht als das traditionelle Vererbungsmuster in Objective-C.

Habe ich richtig verstanden? Können Sie bitte klarstellen?

EDIT:

Was ich meine, durch das, was ich sehe, ist anders: Von Apple WWDC

Der traditionelle Weg ist (Slide76):

class Ordered { 
func precedes(other: Ordered) -> Bool { fatalError("implement me!") } 
} 
class Number : Ordered { 
var value: Double = 0 
override func precedes(other: Ordered) -> Bool { 
return self.value < (other as! Number).value 
} 
} 

Der neue Swift Weg ist (Folie 90):

protocol Ordered { 
func precedes(other: Self) -> Bool 
} 
struct Number : Ordered { 
var value: Double = 0 
func precedes(other: Number) -> Bool { 
return self.value < other.value 
} 
} 

Und ich habe noch nie Protokolle in Objective-C verwendet. Wie unterscheiden sie sich?

+5

* "... wo immer jedes Protokoll muss einen Delegaten Eigenschaft haben" * - Nein –

+6

Sie haben einige sehr falsche Annahmen. In Objective-C benötigen Sie keine Delegate-Eigenschaft für jedes Protokoll. – rmaddy

+0

Auch jede einzelne Klasse mit einer oder mehreren Eigenschaften verwendet das Kompositionsmuster.Das hat nichts mit der Programmiersprache zu tun. Und Protokolle haben nichts mit dem Kompositionsmuster (in irgendeiner Sprache) zu tun. – rmaddy

Antwort

7

Sowohl in Objective-C als auch in Swift haben Protokolle genau einen Zweck: Will man zulassen, dass beliebige oder nicht verwandte Typen bestimmte Mitglieder haben (oder, im Falle optionaler Mitglieder, zumindest diese Mitglieder haben können) . Insbesondere ist diese Garantie für den Compiler wichtig. Im Grunde genommen ist ein Protokoll eine Art Pseudo-Typ, der die reale Typ-Struktur überlagert und sie auf neue Art und Weise vereint (anstelle von zum Beispiel dem "Mixin", der von einigen anderen Sprachen für denselben Zweck verwendet wird; Ruby zum Beispiel benötigt keine Protokolle, da es Module hat). Zum Beispiel können ein Vogel und ein Insekt nicht zusammenhängende Klassen sein, oder sogar (in Swift) überhaupt keine Klassen, aber wenn beide das Flier-Protokoll anwenden, das eine fly()-Methode erfordert, weiß der Compiler, dass beide fliegen können und ermöglicht es, die Nachricht fly() an einen Vogel oder ein Insekt zu senden.

Die Tatsache, dass Protokolle in verschiedenen gängigen und wichtigen Architekturmustern wie Delegation verwendet werden können, ist eine rein sekundäre, aber sehr natürliche Folge der Art der Protokolle.

+0

so schnell Protokolle sind nicht anders als Objective-C? – Honey

+2

Grundsätzlich ist ein Protokoll ein Protokoll. Schnelle Protokolle sind nach Objective-C-Protokollen modelliert. Sie sind jedoch mächtiger, weil Sie Protokollerweiterungen haben können und weil sie von Strukturen und Enums übernommen werden können, die keine andere Möglichkeit haben, eine Hierarchie auszudrücken. – matt

2

Protokolle in Swift können Implementierung ohne ein Objekt (in einer Protokollerweiterung) haben. Sie können auch erweitert werden. Es gibt auch offensichtlich alles, was Sie mit Generics in Swift tun können, was in Objective C nicht möglich wäre. So könnte zum Beispiel das Indexable-Protokoll um eine Funktion erweitert werden, die die Indexbereichslänge zurückgibt, die möglicherweise nur dann gilt, wenn der Index ist ein Int wie folgt aus:

extension Indexable where Self.Index == Int 
{ 
    func length() -> Int 
    { 
    return endIndex - startIndex 
    } 
} 

(! Hoffentlich bin ich meine Erinnerung Swift Syntax korrekt)

+0

Können Sie bitte ein Beispiel für die Implementierung ohne ein Objekt geben? – Honey

+1

Es gibt ein tolles WWDC-Video über Swift-Protokoll-Zeug https://developer.apple.com/videos/play/wwdc2015/408/ –

+0

Ich habe dieses Video schon gesehen, aber ich konnte nur einige Teile davon erfassen. Auf welchen Teil beziehen Sie sich? Macht es Ihnen etwas aus, Ihre Antwort mit einem Beispielcode zu bearbeiten? – Honey