覆盖协议扩展默认实现
override protocol extension default implementation
考虑以下代码
// GENERATED PROTOCOL, CANNOT BE MODIFIED
protocol SomeProtocol {
}
// GENERATED CLASS, CANNOT BE MODIFIED
class A {
}
// GENERATED CLASS, CANNOT BE MODIFIED
class B: A, SomeProtocol {
}
// I CAN CHANGE ONLY FROM HERE BELOW
extension SomeProtocol {
func someMethod() {
print("protocol implementation")
}
}
extension B {
func someMethod() {
print("class implementation")
}
}
let some: SomeProtocol = B()
some.someMethod() //this prints "protocol implementation"
我希望 some.someMethod() 打印“class 实现”。我知道有很多方法可以实现这一点,一种是在 SomeProtocol 中添加 someMethod,但不幸的是,我无法更改 SomeProtocol、A 或 B 的 none,这些都是生成的。我只能玩扩展。有没有办法在不触及前面提到的 3 的情况下实现这一目标?
如果您将变量声明为协议类型,它将始终采用协议方法的默认实现,因为该方法是在协议的扩展中声明的。
如果不将方法添加到协议声明本身(您已经声明这对您来说是不可能的),访问符合类型的特定实现的唯一方法是将 some
向下转换为 B
或首先将其存储为 B
。
let some: SomeProtocol = B()
some.someMethod() //this prints "protocol implementation"
(some as? B)?.someMethod() // this prints "class implementation"
let someB = B()
someB.someMethod() // this prints "class implementation"
考虑以下代码
// GENERATED PROTOCOL, CANNOT BE MODIFIED
protocol SomeProtocol {
}
// GENERATED CLASS, CANNOT BE MODIFIED
class A {
}
// GENERATED CLASS, CANNOT BE MODIFIED
class B: A, SomeProtocol {
}
// I CAN CHANGE ONLY FROM HERE BELOW
extension SomeProtocol {
func someMethod() {
print("protocol implementation")
}
}
extension B {
func someMethod() {
print("class implementation")
}
}
let some: SomeProtocol = B()
some.someMethod() //this prints "protocol implementation"
我希望 some.someMethod() 打印“class 实现”。我知道有很多方法可以实现这一点,一种是在 SomeProtocol 中添加 someMethod,但不幸的是,我无法更改 SomeProtocol、A 或 B 的 none,这些都是生成的。我只能玩扩展。有没有办法在不触及前面提到的 3 的情况下实现这一目标?
如果您将变量声明为协议类型,它将始终采用协议方法的默认实现,因为该方法是在协议的扩展中声明的。
如果不将方法添加到协议声明本身(您已经声明这对您来说是不可能的),访问符合类型的特定实现的唯一方法是将 some
向下转换为 B
或首先将其存储为 B
。
let some: SomeProtocol = B()
some.someMethod() //this prints "protocol implementation"
(some as? B)?.someMethod() // this prints "class implementation"
let someB = B()
someB.someMethod() // this prints "class implementation"