2

我一直在尝试继承并为我的枚举变量分配一个值,但它每次都向我显示以下错误。

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

不能用存储的属性覆盖animalType

class Animals : Livingrhings {
    var canFly = false
    enum AnimalsType {
        case underwater
        case soil
        case none
    }

}


class Wild : Animals {
    var animalType : AnimalsType = .none

}

class Crocodile : Wild {
    override var animalType: Animals.AnimalsType = .underwater // Error line
}

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

在此处输入图像描述

4

2 回答 2

3

这与它是枚举类型这一事实无关。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)
    }
}

根据您想要实现的目标,任何一种方式都可能更适合您的需求。

于 2019-12-30T14:50:31.173 回答
2

看起来值取决于类,即,您不需要在实例的生命周期内更改其值。如果是这种情况,您可以将其更改为计算属性:

var animalType: AnimalsType { return .none }

override var animalType: AnimalsType { return .underwater }

另一种可能性是定义一次存储的属性并init为每个类分配初始值。

于 2019-12-30T14:38:09.830 回答