gpt4 book ai didi

swift - 协议(protocol)扩展和子类化问题

转载 作者:搜寻专家 更新时间:2023-11-01 05:43:44 24 4
gpt4 key购买 nike

所以我想使用面向协议(protocol)的编程范例和 OOP 将一些变量分配给主类,比如 UIView、UIImageView 等,然后在它们的子类中定义一些其他变量。要实现这一点,需要使这些变量成为“可选的”,而 Swift 的一种实现方式是扩展协议(protocol)。一切都很好,直到我决定将这些子类实例添加到数组并稍后读取这些变量......这是完全相同的对象(相同的指针)但是在添加到数组后读取该变量时它使用协议(protocol)扩展中的getter不是来自子类的那个。

protocol SomeProtocol {
var foo: String { get }
var foo2: String { get }
}

extension SomeProtocol {
var foo2: String {
return "value from extension"
}
}

extension UIView: SomeProtocol {
var foo: String {
return "value from UIView"
}
}

class SomeView: UIView {
var foo2: String {
return "value from someView"
}
}

let someView = SomeView()
print(someView.foo2)

"value from someView"

var array = [SomeProtocol]()
array.append(someView)

print(array.first?.foo2)

"value from extension"

我知道它是一个符合 SomeProtocol 的对象数组,这可能是一个原因。问题是我想要一组符合该协议(protocol)的不同类的对象,并且能够从这些对象而不是协议(protocol)扩展中访问 getter。如果我使用 @objc 协议(protocol)和 optional 变量可能是可行的,但我更愿意使用纯 Swift 解决方案。

最佳答案

您的数组定义了 SomeProtocol 类型,因此直接调用对象数组您将在扩展中找到代码。

要获得预期的效果,您必须将对象映射到预期的类型:

if let someView = array.first as? SomeView {
print(someView.foo2)
}

会给你预期的:

value from someView

关于swift - 协议(protocol)扩展和子类化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827788/

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