一尘不染

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

swift

我正在阅读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()将无法正常工作,我想知道是否有一种方法可以更改枚举的关联值,以及如何更改?


阅读 339

收藏
2020-07-07

共1个答案

一尘不染

最直接的问题是,let当您应该使用声明不可变变量(用声明)时,您尝试更改其值var。但是,由于您的name变量包含关联值的副本,因此,这不会解决此特定问题,但是通常这是您需要注意的。

如果要解决此问题,则需要将该adjust()函数声明为muting函数,并根据具体情况将其自身重新分配为一个新的枚举值,并具有一个由旧值和新值组成的关联值。例如:

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