覆盖协议扩展默认实现

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"