我能改变枚举的关联值吗?

28

我正在阅读Swift教程,遇到了一个问题。 以下是代码:

enum SimpleEnum {
    case big(String)
    case small(String)
    case same(String)

    func adjust() {
        switch self {
        case let .big(name):
            name +=  "not"
        case let .small(name):
            name +=  "not"
        case let .same(name):
            name +=  "not"
        }
    }
}

adjust()函数无法工作,我想知道是否有一种方法可以更改枚举的相关值,以及如何操作?

adjust()函数无法工作,我在想有没有办法修改枚举的关联值,应该怎么做呢?


2
值得注意的是,对于每个情况具有相同关联值的枚举最好建模为结构体 - 例如 struct S { enum Kind { case big, small, same }; var kind: Kind; var name: String }。这大大简化了这种变异。 - Hamish
1个回答

62

你最迫切的问题是,你试图更改一个不可变的变量的值(使用let声明),而应该使用var进行声明。尽管这不会解决这个特定的问题,因为你的name变量包含了相关值的副本,但通常情况下你需要意识到这一点。

如果你想解决这个问题,你需要将adjust()函数声明为一个可突变的函数,并根据情况逐个重新分配self为一个新的枚举值,其关联值由旧值和新值组成。例如:

enum SimpleEnum{
    case big(String)
    case small(String)
    case same(String)

    mutating func adjust() {
        switch self{
        case let .big(name):
            self = .big(name + "not")
        case let .small(name):
            self = .small(name + "not")
        case let .same(name):
            self = .same(name + "not")
        }
    }
}

var test = SimpleEnum.big("initial")
test.adjust()

switch test {
case let .big(name):
    print(name) // prints "initialnot"
case let .small(name):
    print(name)
case let .same(name):
    print(name)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接