拡張機能を使用して、プロトコルコンプライアンスを別のプロトコルに追加することはできますか?
たとえば、AがBに準拠するようにします。
protocol A {
var a : UIView {get}
}
protocol B {
var b : UIView {get}
}
タイプAのオブジェクトにBのデフォルト実装(コンプライアンス)を与えたい
// This isn't possible
extension A : B {
var b : UIView {
return self.a
}
}
自分の「ブリッジ」を作成せずにBが必要な場合に、Aのオブジェクトを再利用する動機
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()
}
}
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
A
からB
inheritsを作成できます。
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
で使用できます。