2017-03-08 68 views
1

超属性类型在一个名为TableViewCell我有一个属性更改上迅速

class TableViewCell { 
    var model: AnyObject? 
} 

在一类称为超类CountryTableViewCell我写了这个代码

class CountryTableViewCell : TableViewCell { 

    var model:[AnyObject]? { 

     didSet { 
      // do some stuff 
     } 
    } 
} 

,我得到这个错误

属性模型[AnyObject]?无法覆盖类型为 的任何属性Anyobject?

是没可能的财产模型更改到一个数组?

+0

尝试用VAR模型前覆盖:[AnyObject] – Kingalione

+0

不行,同样的错误 –

回答

2

不,你不能用这样的。

class TableViewCell { 
    var model: Any? 
} 

class CountryTableViewCell : TableViewCell { 

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

现在,如果你想在didSet模型的数组,那么你可以键入它转换:也AnyObjectAny如果使用斯威夫特3.

您可以更改如下代码来代替如下面的代码。

class CountryTableViewCell : TableViewCell { 

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

它的工作完美谢谢。但我使用的是Swift 3,我使用AnyObject而不是Any。这是一个问题吗? –

+0

@从斯威夫特3 J.Doe起,你将需要使用任何代替AnyObject。 –

+0

你有什么参考?在这里,他们说这是不一样的https://medium.com/@mimicatcodes/any-vs-anyobject-in-swift-3-b1a8d3a02e00#.11oyobtcw –

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显示运行时的办法解决这个。您不会在编译类型中获得数组,但至少可以确保您在运行时拥有数组。

原则,如果财产是只读的这种专业化的子类应该工作(这是同为限制函数的返回类型),但随着斯威夫特的3.任何人都关心这个文件可以不工作向Swift团队发送SE请求☺。

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