如何为枚举关联值实现swift下标setter

时间:2015-12-08 18:33:33

标签: swift enums subscript-operator

尝试让以下工作:

enum Foobar {
    case values([Int])
    case singleThing(Double)

    subscript(index:Int) -> Int? {
        get {
            switch self {
            case .values (let numbers):
                return numbers[index]
            default:
                return nil
            }
        }
        set {
            switch self {
            case .values (let numbers):
                numbers[index] = newValue!
            default:
                break
            }
        }
    }
}

上面的代码不会编译。它抱怨我在使用numbers分配let时更新let。所以我尝试用var替换set。哪个编译。但什么都不做,因为它更新了关联数组的值副本,而不是原始数组本身。至少我认为会发生这种情况。

是否有一种方法可以让我拥有可订阅的关联值并在适当时实现NSUTF8StringEncoding属性?

2 个答案:

答案 0 :(得分:4)

case .values (let numbers):
    numbers[index] = newValue!

numbers本地变量,它绑定到当前关联的 值。即使使用var numbers,也只修改此变量 枚举的实例。

case .values (var numbers):
    numbers[index] = newValue!
    self = .values(numbers)

应该做你期望的。 (但请注意调用下标 使用nil的setter会使您的程序崩溃。)

答案 1 :(得分:1)

你遇到了几个问题。

  • 无法更改枚举的关联值
  • 在您的案例陈述中
    • 您将number定义为不可变的常量
    • number是关联值的副本,因为数组是通过复制传递的结构

如果将enums视为不可变的值类型会更好,它会使一切变得更容易。如果需要可变类型,可以使用结构或类。

如果您真的需要它以这种方式运行,您可以通过将大小写改为这样来实现它。

case .values (var numbers):
    numbers[index] = newValue!
    self = .values(numbers)