2015-04-18 2 views
17

Ich versuche, eine typealias für eine Delegate-Eigenschaft UITableViewCell zu definieren, die mehreren Protokollen entspricht. Das ist, was ich versuche zu tun, und Swift beschwert sich, dass meine Syntax falsch ist:Definieren Sie eine Swift-Typalias für jedes Objekt, das mehrere Protokolle implementiert

// The typealias definition 
typealias CellDelegate = AnyObject<UIPickerViewDataSource, UIPickerViewDelegate> 

// In my UITableViewCell subclass: 
weak var delegate: CellDelegate? 

„Kann das nicht-generischer Typ ANYOBJECT nicht spezialisieren“ ist der Fehler Ich erhalte. Wie mache ich das richtig?

Antwort

21

Der Code, den Sie geschrieben hat unterschiedliche Bedeutung von dem, was Sie erwarten würden. Sie behandeln AnyObject wie einen generischen Typ mit UIPickerViewDataSource und UIPickerViewDelegate als Typargumente. Es ist das gleiche wie ein Dictionary mit Int Schlüssel erstellen und String Werte, zum Beispiel:

var someDictionary: Dictionary<Int, String> 

Was Sie versuchen, braucht eine andere Konstrukt, Zusammensetzung Protokoll zu erreichen genannt. Swift stellt es speziell zur Verfügung, um Typen auszudrücken, die mehreren Protokollen entsprechen. Die Syntax ist die folgende, können Sie es überall verwenden können, können Sie regelmäßige Typen verwenden:

FirstProtocol & SecondProtocol 

Mit dieser Funktion würden Sie den Code werden:

// The typealias definition 
typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate 

// In my UITableViewCell subclass: 
weak var delegate: CellDelegate? 

Protocol Zusammensetzung wird in Apples Leitfaden für die Swift erklärt Sprache, here.

EDIT: Aktualisiert Swift 3 Syntax dank @raginmari

+3

In Swift 3 hat die Syntax geändert in 'typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate'. – Raginmari

1

Ich verstehe nicht, warum Sie diese weak var delegate: <CellDelegate>? geben und warum Sie nicht eingeben weak var delegate: CellDelegate?

Das Problem ist, dass ANYOBJECT generisch ist. Mit der ersten Zeile versuchen Sie, AnyObject nicht-generisch zu machen, und das ist es nicht.

Sie machen besser eine Klasse, die diese (die Datenquelle und den Delegaten) implementieren.

+0

Ah, die spitzen Klammern - Ich habe vergessen, nur um sie von zu entfernen, was genau meine beabsichtigte 'typealias' ist. –

+0

'AnyObject' ist kein generischer Typ, es ist eigentlich ein Protokoll, dem alle Klassen entsprechen, was der Compiler-Fehler sagt:" Kann den ** nicht generischen Typ ** AnyObject "nicht spezialisieren – EliaCereda

1

Sie sollten ein bekanntes Objekt übergeben, AnyObejct zu allgemein ist, und das ist, warum Sie es nicht tun

3

, wenn Sie Multi erklären möchten:

protocol<A, B> 
2

Mit Swift 3, änderte sich die Syntax.

Bis Swift 2.3: typealias CellDelegate = protocol<UIPickerViewDataSource, UIPickerViewDelegate>

Seit Swift 3: typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate