2

试图让以下工作:

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. 所以我尝试letvar. 哪个编译。但什么也不做,因为它更新了关联数组的值副本,而不是原始数组本身。至少我认为会发生这种情况。

是否有一种方法可以让我拥有可下标的关联值并set在适当的时候实现该属性?

4

2 回答 2

4

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

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

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

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

于 2015-12-08T18:43:48.677 回答
1

你遇到了几个问题。

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

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

如果您真的需要它以这种方式运行,您可以通过将外壳更改为如下所示来使其工作。

case .values (var numbers):
    numbers[index] = newValue!
    self = .values(numbers)
于 2015-12-08T18:45:38.350 回答