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

How to implement swift subscript setter for enum associated value

正在尝试使以下内容起作用:

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
            }
        }
    }
}

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

有没有一种方法可以让我拥有可订阅的关联值并在适当的时候实施 set 属性?

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

numbers 是一个 局部变量 绑定到当前关联 价值。即使使用 var numbers,您也只修改此变量,而不是 枚举的实例。

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

应该会如您所愿。 (但是请注意,调用下标 setter 和 nil 会使你的程序崩溃。)

您 运行 遇到了一些问题。

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

最好将枚举视为不可变的值类型,这会使一切变得更容易。如果您需要可变类型,您可以使用结构或 class。

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

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