私は次のようにしなければならないと思っているものがなぜ印刷されないのだろうと思っています。プロトコルの拡張子とサブクラス
/* Fails */
protocol TheProtocol {
func update()
}
class A: TheProtocol {
}
class B : A {}
extension TheProtocol {
func update() {
print("Called update from TheProtocol")
}
}
extension TheProtocol where Self: B {
func update() {
print("Called update from B")
}
}
let instanceB = B()
instanceB.update()
let instanceBViaProtocol:TheProtocol = B()
instanceBViaProtocol.update()
これは、印刷され、次の
Called update from B
Called update from TheProtocol // Why not: Called update from B (extension)
instanceBViaProtocol.update()
がTheProtocolに拡張して()更新を実行しませんなぜ私は特に疑問に思って:
extension TheProtocol where Self: B {
func update() {
print("Called update from B")
}
}
私はそれがBはTheProtocolを採用しているAから継承しているので、Bは暗黙のうちにTheProtocolも採用すると思います。 プロトコルの採用をAからBに移動すると、期待される結果が得られます。
protocol TheProtocol {
func update()
}
class A { // Remove TheProtocol
}
class B : A, TheProtocol {} // Add TheProtocol
extension TheProtocol {
func update() {
print("Called update from TheProtocol")
}
}
extension TheProtocol where Self: B {
func update() {
print("Called update from B")
}
}
let instanceB = B()
instanceB.update()
let instanceBViaProtocol:TheProtocol = B()
instanceBViaProtocol.update()
結果:
Called update from B
Called update from B
私はhttps://medium.com/ios-os-x-development/swift-protocol-extension-method-dispatch-6a6bf270ba94#.6cm4oqaq1とhttp://krakendev.io/blog/subclassing-can-suck-and-heres-whyで見ていたが、私はこれを理解することができませんでした。拡張メソッドは、プロトコルを採用するエンティティのサブクラスでは尊重されないのですか?
'拡張機能TheProtocolをSelf:B {'〜 '拡張機能TheProtocol where Self:A {'とあなたに何か説明しているかを見てください。 –
チップをありがとう。 – user6902806