在swift上更改超类属性类型

时间:2017-03-08 12:31:56

标签: swift properties superclass

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

class TableViewCell {
    var model: AnyObject?
}

在一个名为CountryTableViewCell的班级中,我写了这段代码

class CountryTableViewCell : TableViewCell {

    var model:[AnyObject]? {

        didSet {
            // do some stuff
        }
    }
}

我收到了这个错误

  使用[AnyObject]的

属性模型?无法覆盖具有类型的属性   Anyobject?

是否无法将属性模型更改为数组?

2 个答案:

答案 0 :(得分:2)

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

您可以按以下方式更改代码:

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...
               }
            }
        }
}

答案 1 :(得分:0)

不能更改属性的类型。如果允许,则会违反类型安全:

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!

@ParthAdroja's answer为此显示了运行时解决方法。你不会在编译类型中得到一个数组,但至少可以确保你在运行时有一个数组。

原则上,如果属性是只读的,那么子类中的这种特殊化应该起作用(它与限制函数的返回类型相同),但它不像Swift 3那样工作。任何关心这个的人都可以提交一个SE请求Swift团队☺。

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