gpt4 book ai didi

ios - 覆盖协议(protocol)扩展默认实现

转载 作者:行者123 更新时间:2023-12-01 18:34:24 25 4
gpt4 key购买 nike

考虑以下代码

// 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() 打印“类实现”。我知道有办法实现这一点,一种是添加 SomeProtocol someMethod,但不幸的是,我无法更改 SomeProtocol、A 或 B,这些都是生成的。我只能玩扩展。有没有办法在不触及前面提到的 3 的情况下实现这一目标?

最佳答案

如果将变量声明为协议(protocol)类型,它将始终采用协议(protocol)方法的默认实现,因为该方法是在协议(protocol)的扩展中声明的。
如果不将方法添加到协议(protocol)声明本身(您已声明对您来说不可能),访问符合类型的特定实现的唯一方法是向下转换 someB或将其存储为 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"

关于ios - 覆盖协议(protocol)扩展默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62716823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com