在名为TableViewCell
的超类中,我有一个属性
class TableViewCell {
var model: AnyObject?
}
在一个名为CountryTableViewCell
的班级中,我写了这段代码
class CountryTableViewCell : TableViewCell {
var model:[AnyObject]? {
didSet {
// do some stuff
}
}
}
我收到了这个错误
使用[AnyObject]的属性模型?无法覆盖具有类型的属性 Anyobject?
是否无法将属性模型更改为数组?
答案 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,但我们还不知道它是什么。)