ios - 如何覆盖父类(super class)的可变属性

标签 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 {

}

这是我得到的错误:

Cannot override mutable property 'currentCard' of type 'ArcaneCardView?' with covariant type 'PostCard?'

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

var card = currentCard as! PostCard

最佳答案

当你覆盖一个变量时,你不能改变它的类型。为什么不?好吧,假设您能够做到这一点,那么可能会出现以下情况:

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!!!

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

关于ios - 如何覆盖父类(super class)的可变属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31598796/

相关文章:

ios - 当使用 Batch 为 iOS 开发的 Swift 中的用户更改 Firebase 数据库节点值时如何触发远程推送通知?

swift - SpriteNode 位置与触摸位置

iphone - AVPlayerLayer 中视频帧的实时处理

ios - 无法插入新 socket ?

ios - 如何在 UITableView 中将 UITableViewCell Image 更改为 Circle

ios - 只有底角是圆的

ios - 在核心数据中更改托管对象模型的属性值时崩溃

iphone - 访问 google reader 的 Endpoints API 时出错

ios - 如何识别以前安装在 iOS 设备中的应用程序?

swift - UITableView 删除行