ios - tipografias - Defina una tipografía de Swift para cualquier objeto que implemente múltiples protocolos.
tipografia juvenil (5)
Estoy tratando de definir una typealias
para una propiedad delegada de UITableViewCell que se ajusta a múltiples protocolos. Esto es lo que estoy tratando de hacer y Swift se queja de que mi sintaxis es incorrecta:
// The typealias definition
typealias CellDelegate = AnyObject<UIPickerViewDataSource, UIPickerViewDelegate>
// In my UITableViewCell subclass:
weak var delegate: CellDelegate?
"No se puede especializar el tipo no genérico AnyObject" es el error que obtengo. ¿Cómo hago esto correctamente?
Con Swift 3, la sintaxis cambió.
Hasta Swift 2.3: typealias CellDelegate = protocol<UIPickerViewDataSource, UIPickerViewDelegate>
Desde Swift 3: typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate
Debes pasar un objeto conocido, AnyObejct es demasiado genérico y por eso no puedes hacerlo
El código que usted publicó tiene un significado diferente al que usted esperaría. Está tratando a AnyObject
como un tipo genérico, con UIPickerViewDataSource
y UIPickerViewDelegate
como argumentos de tipo. Es lo mismo que crear un Dictionary
con claves Int
y valores de String
, por ejemplo:
var someDictionary: Dictionary<Int, String>
Lo que estás tratando de lograr necesita una construcción diferente, llamada composición de protocolo . Swift lo proporciona específicamente para expresar tipos que se ajustan a múltiples protocolos. Su sintaxis es la siguiente, puede usarla en cualquier lugar donde pueda usar tipos normales:
FirstProtocol & SecondProtocol
Usando esta característica, su código se convertiría en:
// The typealias definition
typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate
// In my UITableViewCell subclass:
weak var delegate: CellDelegate?
La composición del protocolo se explica en la guía de Apple para el lenguaje Swift, here .
EDIT: actualizado a la sintaxis Swift 3, gracias @raginmari
No entiendo por qué escribe así este weak var delegate: <CellDelegate>?
y ¿por qué no escribe weak var delegate: CellDelegate?
El problema es que AnyObject es genérico. Con la primera línea tratas de hacer AnyObject no genérico, y no lo es.
Es mejor hacer una clase que implemente esas (la fuente de datos y el delegado).
Si quieres declarar multiprotocolo:
protocol<A, B>