所以我希望在OOP中使用面向协议的编程范例,将一些变量分配给主类,比如让我们说UIView,UIImageView等,但是后面还有一些其他的变量。子类。为了实现这一目标,需要制作这些变量"可选" Swift的一种方法是扩展协议。一切都很好,直到我决定将这些子类实例添加到数组并稍后读取这些变量...这是同一个对象(相同的指针)但是在添加到数组后读取该变量时它使用来自协议扩展的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)
" someView"
的价值
var array = [SomeProtocol]()
array.append(someView)
print(array.first?.foo2)
"来自扩展程序的值"
我知道它是符合SomeProtocol
的一系列对象,这可能是一个原因。问题是我希望拥有符合该协议的不同类的对象数组,并且能够从那些不是来自协议扩展的对象访问getter。如果我使用@objc
协议和optional
变量可能是可能的,但我更愿意使用纯Swift解决方案。
答案 0 :(得分:-1)
您的数组已经定义了SomeProtocol类型,因此直接调用对象数组,您将获得扩展中的代码。
要获得所需效果,您必须将对象映射到预期类型:
ON
会给你预期的:
来自someView的值