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
答案 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