tipografico tipografias tipografia tipo para mac letra juvenil infantiles fuentes descargar dafont celular catalogo ios cocoa-touch swift

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>