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

时间:2015-07-18 06:44:28

标签: 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):
            name +=  "not"
        case let .same(name):
            name +=  "not"
        }
    }
}

函数adjust()不起作用,我想知道是否有办法改变枚举的关联值,以及如何?

1 个答案:

答案 0 :(得分:30)

您最直接的问题是,当您应该使用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)
}