在 swift 上更改超类 属性 类型

Change superclass property type on swift

在一个名为 TableViewCell 的超级 Class 中,我有一个 属性

class TableViewCell {
    var model: AnyObject?
}

在一个叫做CountryTableViewCell的class中我写了这段代码

class CountryTableViewCell : TableViewCell {

    var model:[AnyObject]? {

        didSet {
            // do some stuff
        }
    }
}

我遇到了这个错误

property model with [AnyObject]? cannot override a property with type Anyobject?

难道不能把属性模型改成数组吗?

不,你不能那样使用。如果使用 Swift,AnyObject 也应替换为 Any 3.

您可以如下更改代码:

class TableViewCell {
    var model: Any?
}

class CountryTableViewCell : TableViewCell {

    override var model: Any? {
        didSet {
        }
    }
}

现在如果你想在 didSet 中获取模型的数组,那么你可以按下面的代码键入它。

class CountryTableViewCell : TableViewCell {

        override var model: Any? {
            didSet {
               if let arrModel = model as? [Any] {
                  // Do Stuff...
               }
            }
        }
}

否 属性 的类型无法更改。如果允许这样做,它将通过以下方式违反类型安全:

let subcell: CountryTableViewCell = CountryTableViewCell()
let supercell: TableViewCell = subcell
supercell.model = "anything that is not an array" as NSString
let wrong = subcell.model   // not an array!

显示了一个运行时解决方法。你不会得到一个编译类型的数组,但至少你可以确保你在运行时有一个数组。

原则上,如果 属性 是只读的,子类中的这种特化应该可以工作(它与限制函数的 return 类型相同),但从Swift 3. 任何关心这个的人都可以向 Swift 团队提出 SE 请求☺。

(另外,Apple do have some magic to make it work with bridged Objective-C classes,但我们还不知道它是什么。)