Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:如何使用超类中的枚举变量?_Swift_Inheritance_Enums_Overriding_Swift5.2 - Fatal编程技术网

Swift:如何使用超类中的枚举变量?

Swift:如何使用超类中的枚举变量?,swift,inheritance,enums,overriding,swift5.2,Swift,Inheritance,Enums,Overriding,Swift5.2,我一直在尝试继承枚举变量并为其赋值,但每次都会显示以下错误 以下是示例源代码(实际代码我无法在此发布) 无法使用存储的属性重写animalType 这是我的游乐场代码的参考快照 该值似乎取决于类,也就是说,在实例的生存期内不需要更改其值。如果是这种情况,可以将其更改为计算属性: var animalType: AnimalsType { return .none } 及 另一种可能是定义存储属性一次,并在init中为每个类指定初始值。这与它是枚举类型这一事实无关。Swift不支持覆盖存储的属性

我一直在尝试继承枚举变量并为其赋值,但每次都会显示以下错误

以下是示例源代码(实际代码我无法在此发布)

无法使用存储的属性重写animalType

这是我的游乐场代码的参考快照


该值似乎取决于类,也就是说,在实例的生存期内不需要更改其值。如果是这种情况,可以将其更改为计算属性:

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)
    }
}