协议扩展和子类化问题

时间:2017-10-19 10:26:15

标签: swift protocols subclass protocol-extension

所以我希望在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解决方案。

1 个答案:

答案 0 :(得分:-1)

您的数组已经定义了SomeProtocol类型,因此直接调用对象数组,您将获得扩展中的代码。

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

ON

会给你预期的:

  来自someView的