2

因此,我想将面向协议的编程范式与 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 解决方案。

4

1 回答 1

-1

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

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

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

会给你预期的:

来自 someView 的值

于 2017-10-19T12:19:46.083 回答