尝试让以下工作:
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
属性?
答案 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)