枚举关联值如何实现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)
正在尝试使以下内容起作用:
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)