2015-04-18 7 views
17

Sto tentando di definire uno typealias per una proprietà delegato di UITableViewCell conforme a più protocolli. Questo è quello che sto cercando di fare e Swift si lamenta che la mia sintassi è sbagliata:Definire una tipografia Swift per qualsiasi oggetto che implementa più protocolli

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

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

"non possono specializzarsi tipo non generico ANYOBJECT" è l'errore che sto ottenendo. Come faccio a farlo correttamente?

risposta

21

Il codice che hai postato ha un significato diverso da quello che ti aspetteresti. Stai trattando lo AnyObject come un tipo generico, con UIPickerViewDataSource e UIPickerViewDelegate come argomenti tipo. E 'la stessa cosa che la creazione di un Dictionary con Int chiavi e String valori, ad esempio:

var someDictionary: Dictionary<Int, String> 

Quello che stai cercando di realizzare le esigenze di un costrutto diverso, chiamato composizione protocollo. Swift lo fornisce in modo specifico per esprimere tipi conformi a più protocolli. La sua sintassi è la seguente, è possibile utilizzare ovunque è possibile utilizzare i tipi regolari:

FirstProtocol & SecondProtocol 

Usando questa funzione, il codice sarebbe diventato:

// The typealias definition 
typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate 

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

composizione protocollo è spiegato nella guida di Apple per la Swift lingua, here.

EDIT: aggiornato per Swift 3 sintassi, grazie @raginmari

+3

In Swift 3 la sintassi ha cambiato in 'typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate'. – Raginmari

1

non capisco il motivo per cui si digita come questo weak var delegate: <CellDelegate>? e perché non si digita weak var delegate: CellDelegate?

Il problema è che ANYOBJECT è generico. Con la prima riga si tenta di rendere AnyObject non generico, e non lo è.

È meglio creare una classe che li implementa (l'origine dati e il delegato).

+0

Ah, le parentesi angolari - ho solo dimenticato di rimuoverli da ciò che esattamente il mio destinato 'typealias' è. –

+0

'AnyObject' non è un tipo generico, in realtà è un protocollo a cui tutte le classi si conformano, che è quello che l'errore del compilatore dice:" Non è possibile specializzare il ** tipo non generico ** AnyObject " – EliaCereda

1

si dovrebbe passare un oggetto conosciuto, AnyObejct è troppo generico, e questo è il motivo per cui non si può fare che

3

se volete dichiarare multiprotocollo:

protocol<A, B> 
2

Con Swift 3, la sintassi cambiati.

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

Dal Swift 3: typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate