Swift 我可以更改枚举的关联值吗?

Swift 我可以更改枚举的关联值吗?,swift,enums,Swift,Enums,我正在阅读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):

我正在阅读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()
不起作用,我想知道是否有办法更改枚举的关联值,以及如何更改?

最直接的问题是,当您应该使用
var
声明不可变变量时,您正试图更改该变量的值(使用
let
)。但这并不能解决这个特殊问题,因为
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)
}

值得注意的是,对于每种情况具有相同关联值的枚举,最好将其建模为结构–例如
struct s{enum Kind{case big,small,same};var Kind:Kind;var name:String}
。这大大简化了这种突变。