是否可以通过扩展名将协议合规性添加到不同的协议?
例如,我们希望A遵守B:
protocol A {
var a : UIView {get}
}
protocol B {
var b : UIView {get}
}
我想将B的默认实现(合规性)赋予A类型的对象
// This isn't possible
extension A : B {
var b : UIView {
return self.a
}
}
在需要B的情况下重用A的对象的动机是在不创建我自己的"桥的情况下#34;
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 ...
}
}
作为旁注,我们可以扩展一个类来实现协议
class C {
let C : UIView
}
// this will work
extension C : B {
var B : UIView {
return self.c
}
}
和协议可以提供默认实现
extension A {
// a default implementation
var a : UIView {
return UIView()
}
}
答案 0 :(得分:16)
扩展A
时,您可以指定该类型也符合B
:
extension A where Self: B {
var b : UIView {
return self.a
}
}
然后让您的类型符合A
和B
,例如
struct MyStruct : A, B {
var a : UIView {
return UIView()
}
}
由于协议扩展,MyStruct
的实例将能够使用a
和b
,即使a
中仅实现了MyStruct
:
let obj = MyStruct()
obj.a
obj.b
答案 1 :(得分:4)
您可以A
从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)
由于A
继承自B
,B
中的每个媒体资源均可在A
中使用。