protocolos programacion orientada objetos swift protocols protocol-extension

swift - programacion - Amplíe los protocolos existentes para implementar otro protocolo con implementos predeterminados.



programacion orientada a protocolos (2)

Al extender A , puede especificar que el tipo también se ajuste a B :

extension A where Self: B { var b : UIView { return self.a } }

Luego haga que su tipo se ajuste a A y B , por ejemplo

struct MyStruct : A, B { var a : UIView { return UIView() } }

Debido a la extensión del protocolo, las instancias de MyStruct podrán usar a y b , aunque solo se implementó en MyStruct :

let obj = MyStruct() obj.a obj.b

¿Es posible agregar el cumplimiento del protocolo a un protocolo diferente por medio de una extensión?

Por ejemplo, nos gustaría que A cumpla con B:

protocol A { var a : UIView {get} } protocol B { var b : UIView {get} }

Quiero dar una implementación predeterminada (cumplimiento) de B a objetos de tipo A

// This isn''t possible extension A : B { var b : UIView { return self.a } }

La motivación es reutilizar objetos de A en los casos en que se requiere una B sin crear mi propio "puente"

class MyClass { func myFunc(object : A) { ... ... let view = object.a ... do something with view ... myFunc(object) // would like to use an ''A'' without creating a ''B'' } func myFunc2(object : B) { ... ... let view = object.b ... do something with view ... } }

Como nota al margen podemos extender una clase para implementar un protocolo.

class C { let C : UIView } // this will work extension C : B { var B : UIView { return self.c } }

y los protocolos pueden dar implementaciones por defecto.

extension A { // a default implementation var a : UIView { return UIView() } }


Puedes hacer que A hereda de B :

protocol A: B { var a: String { get } } protocol B { var b: String { get } } // Default implementation of property b extension A { var b: String { get { return "PropertyB" } } } class MyClass: A { var a: String { get { return "PropertyA" } } func printA(obj: A) { print(obj.a) printB(obj) } func printB(obj: B) { print(obj.b) } } let obj = MyClass() obj.printA(obj)

Como A hereda de B , todas las propiedades en B están disponibles en A