Swift:如何使用超类中的枚举变量?
我一直在尝试继承枚举变量并为其赋值,但每次都会显示以下错误 以下是示例源代码(实际代码我无法在此发布) 无法使用存储的属性重写animalType 这是我的游乐场代码的参考快照Swift:如何使用超类中的枚举变量?,swift,inheritance,enums,overriding,swift5.2,Swift,Inheritance,Enums,Overriding,Swift5.2,我一直在尝试继承枚举变量并为其赋值,但每次都会显示以下错误 以下是示例源代码(实际代码我无法在此发布) 无法使用存储的属性重写animalType 这是我的游乐场代码的参考快照 该值似乎取决于类,也就是说,在实例的生存期内不需要更改其值。如果是这种情况,可以将其更改为计算属性: var animalType: AnimalsType { return .none } 及 另一种可能是定义存储属性一次,并在init中为每个类指定初始值。这与它是枚举类型这一事实无关。Swift不支持覆盖存储的属性
该值似乎取决于类,也就是说,在实例的生存期内不需要更改其值。如果是这种情况,可以将其更改为计算属性:
var animalType: AnimalsType { return .none }
及
另一种可能是定义存储属性一次,并在
init
中为每个类指定初始值。这与它是枚举类型这一事实无关。Swift不支持覆盖存储的属性。我想你有两个选择:
使其成为计算属性
class Wild : Animals {
var animalType: AnimalsType { .none }
}
class Crocodile : Wild {
override var animalType: Animals.AnimalsType { .underwater }
}
这种方法之所以有效,是因为可以重写计算属性。可以说,重写计算属性比重写存储属性更有意义,因为毕竟,存储属性实际上没有任何可重写的内容。它们只是价值观
使其成为初始值设定项的一部分
class Animals {
var canFly = false
let animalType: AnimalsType
init(animalType: AnimalsType) {
self.animalType = animalType
}
enum AnimalsType {
case underwater
case soil
case none
}
}
class Wild: Animals {
convenience init() {
self.init(animalType: .none)
}
}
class Crocodile: Wild {
convenience init() {
self.init(animalType: .underwater)
}
}
取决于您想要实现的目标,任何一种方法都可能更适合您的需要。它是否需要是一个变量,即值是否在对象的生命周期内发生变化?如果没有,请将其更改为computed属性并返回值。@Arkku我觉得它正在根据子类进行更改。不确定。
class Wild : Animals {
var animalType: AnimalsType { .none }
}
class Crocodile : Wild {
override var animalType: Animals.AnimalsType { .underwater }
}
class Animals {
var canFly = false
let animalType: AnimalsType
init(animalType: AnimalsType) {
self.animalType = animalType
}
enum AnimalsType {
case underwater
case soil
case none
}
}
class Wild: Animals {
convenience init() {
self.init(animalType: .none)
}
}
class Crocodile: Wild {
convenience init() {
self.init(animalType: .underwater)
}
}