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