que protocolos protocolo delegate delegados swift protocols

delegate - protocolos y delegados swift



Swift: Propiedad que se ajusta a una clase especĂ­fica y al mismo tiempo a mĂșltiples protocolos (3)

En Objective-C, es posible escribir algo así:

@property(retain) UIView<Protocol1, Protocol2, ...> *myView;

Pero, ¿cómo puedo escribir este código en swift?

Ya sé cómo hacer que una propiedad se ajuste a muchos protocolos, pero no funciona al usar la herencia:

var myView: ??? protocol<Protocol1, Protocol2, ...>

Editar:

Utilizo muchos subtipos UIView como UIImageView , UILabel u otros, y necesito usar algunas de las propiedades de UIView más algunos métodos definidos en los protocolos. En el peor de los casos, podría crear un UIViewProtocol con las propiedades necesarias, pero sabría si en Swift es posible declarar una propiedad / variable con un tipo y algún protocolo para cumplir.


En Swift 4, finalmente es posible. Puede declarar la variable de alguna clase conforme al protocolo al mismo tiempo, así:

// Lets say we''re somewhere in a UIViewController var views: [SomeOfMyUIView] = // Get list of my views views.forEach { self.view.addSubview($0.instance) }


Puedes hacer esto con una clase genérica usando una cláusula where :

Una cláusula where le permite exigir que un tipo asociado se ajuste a un protocolo determinado y / o que ciertos parámetros de tipo y tipos asociados sean los mismos.

Para usarlo, haga que la clase de su propiedad se defina en una clase genérica con una restricción de tipo para verificar si el parámetro de tipo para su propiedad coincide con la clase base y los protocolos deseados.

Para su ejemplo específico, podría verse algo como esto:

class MyViewController<T where T: UIView, T: Protocol1, T: Protocol2>: UIViewController { var myView: T // ... }


Una y probablemente un poco fea una de las formas de hacerlo, es crear un protocolo de envoltura para UIView :

class ClassA { var someVar: String? } protocol ProtocolA {} class ClassB { var someOptional: (ClassA & ProtocolA)? // here is optional value var some: ClassA & ProtocolA // here is non-optional value; need to provide init though :) }

Ahora es posible crear un protocolo que implemente Protocol1 , Protocol2 y UIViewRef , que se usará para obtener UIView sí mismo:

protocol UIViewRef { var instance: UIView { get } }

Y el último paso será implementar los protocolos UIViewRef para su UIView s, que, en su caso, según tengo entendido, ya implementan el Protocol1 y el Protocol2 :

protocol MyUIViewProtocol: UIViewRef, Protocol1, Protocol2 { }

Como resultado tenemos MyUIViewProtocol , los implementadores de los cuales tienen una referencia a un UIView y cada uno de ellos implementan Protocol1 y Protocol2 . Sin embargo, una advertencia: para obtener la propia UIView , debemos preguntar su referencia desde la propiedad de la instance . Por ejemplo

// SomeOfMyViews already implements Protocol1 and Protocol2 extension SomeOfMyUIViews: MyUIViewProtocol { var instance: UIView { return self } }