如何覆盖超类的可变属性

时间:2015-07-23 21:59:04

标签: ios swift

class ArcaneCardVC: UIViewController {
    var currentCard: ArcaneCardView?
}

class PostVC: ArcaneCardVC {    
    override var currentCard: PostCard? 
// <===== This is what I want to do but cant
}

class ArcaneCardView: UIView {

}
class PostCard: ArcaneCardView {

}

这是我得到的错误:

  

无法覆盖'ArcaneCardView'类型的可变属性'currentCard'?协变型'PostCard?'

另一个解决方案是每次使用currentCard时在代码中明确地执行此操作:

var card = currentCard as! PostCard

2 个答案:

答案 0 :(得分:4)

覆盖变量时,无法更改其类型。为什么?假设您能够这样做,那么可能会出现以下情况:

var A: PostVC = PostVC() // some initialization 
var B: ArcaneCardVC = A // this is a valid state since `PostVC` is a subclass of `ArcaneCardVC`

B.currentCard的类型应该是什么?嗯,这是一个复杂的问题。您可以回答其类型应为PostCard。好的,我们可以为聚会添加其他课程:

class OtherCard: ArcaneCardView {

}

class OtherVC: ArcaneCardVC {    
    override var currentCard: OtherCard?      
}

现在考虑以下代码:

var A: ArcaneCardVC = PostVC()
var B: ArcaneCardVC = OtherVC()
A.currentCard = B.currentCard // something will crash here!!!

为了避免这种行为,在进行子类化时不能更改属性的类型。

答案 1 :(得分:1)

正确的方法是使用currentCard as! PostCard

另一个选择是使用像

这样的属性getter
// inside PostVC

// Note the camel case on the 'C' makes it a different variable that the super class
var CurrentCard: PostCard {
    get { return self.currentCard as! PostCard }
}

然后您使用self.CurrentCard代替self.currentCard as! PostCard