Swift:如何使用父类枚举变量?子类重写存储属性报错求助
解决Swift中“Cannot override with a stored property”错误的方案
你遇到的这个问题其实是Swift里的一个基础规则:存储属性不能被子类重写。你在Wild类里定义的animalType是一个存储属性(直接持有.none这个值),子类Crocodile试图用override关键字覆盖它,这就触发了错误。
下面给你几个符合你需求的解决方案:
方案1:在子类初始化时修改值(最简单直接)
如果你的需求只是给子类的animalType设置不同的默认值,完全不需要override,只要在子类的初始化方法里修改父类继承来的存储属性就行:
class Animals : Livingrhings { var canFly = false enum AnimalsType { case underwater case soil case none } } class Wild : Animals { var animalType : AnimalsType = .none } class Crocodile : Wild { init() { super.init() // 直接修改继承来的存储属性值 self.animalType = .underwater } }
Playground里的类默认会生成无参初始化器,所以这样写完全没问题,而且逻辑清晰。
方案2:把父类属性改成计算属性(适合需要动态逻辑的场景)
如果你希望子类能自定义animalType的返回逻辑(比如根据某些条件动态返回),可以把父类的存储属性改成计算属性,这样子类就能合法地override它:
class Animals : Livingrhings { var canFly = false enum AnimalsType { case underwater case soil case none } } class Wild : Animals { // 父类改为计算属性,返回默认值 var animalType: Animals.AnimalsType { return .none } } class Crocodile : Wild { // 子类override计算属性,返回自己的类型 override var animalType: Animals.AnimalsType { return .underwater } }
这种方式的好处是,如果后续需要在子类里添加更多逻辑(比如根据鳄鱼的状态返回不同类型),扩展起来很方便。
为什么会出现这个错误?
简单来说,存储属性是在类的实例内存中直接占用空间来存储值的,子类继承父类时会共享这些内存结构。如果允许子类重写存储属性,相当于要重新定义内存布局,这会破坏继承的一致性——所以Swift干脆禁止了这种操作。
内容的提问来源于stack exchange,提问作者Malhar
相关产品推荐
相关产品推荐

