使用 -=/+= 调用计算 属性 的 setter 时的边界检查
Bounds checking when calling computed property's setter using -=/+=
我试图确保计算出的 属性 的 setter 仅在特定范围内设置 newValue
。计算出的 属性 的支持值为 UInt
.
所以我认为我可以做的是使用 min(max(newValue, 0), UInt.max)
,像这样:
private var _value: UInt = 100
public var value: UInt {
get { return _value }
set { _value = min(max(newValue, 0), UInt.max) }
}
但是当我使用 for 循环来递减使用 -=
的值时,我抛出了一个异常。
for _ in 0..<1000 {
value -= 1
}
这似乎没有进行任何边界检查。有解决办法吗?
它必须是计算的 属性 所以我不能使用 didSet。 属性 实际上是其他值数组中某个值的别名。以上仅为举例。
问题是 value -= 1
等同于 value = value - 1
。如您所见,必须在设置 value
之前计算 value - 1
,因此您的边界检查代码甚至没有机会 运行。即使它确实 运行,它也永远不会找到一个小于 0 的值来进行边界检查,因为你的 属性 是 UInt
.
如果您将 属性 更改为 Int
,这将按预期工作,甚至在 Cocoa 中也有使用 Int
的先例负数没有意义。 (但是,出于同样的原因,检查 Int.max
仍然毫无意义。)
我试图确保计算出的 属性 的 setter 仅在特定范围内设置 newValue
。计算出的 属性 的支持值为 UInt
.
所以我认为我可以做的是使用 min(max(newValue, 0), UInt.max)
,像这样:
private var _value: UInt = 100
public var value: UInt {
get { return _value }
set { _value = min(max(newValue, 0), UInt.max) }
}
但是当我使用 for 循环来递减使用 -=
的值时,我抛出了一个异常。
for _ in 0..<1000 {
value -= 1
}
这似乎没有进行任何边界检查。有解决办法吗?
它必须是计算的 属性 所以我不能使用 didSet。 属性 实际上是其他值数组中某个值的别名。以上仅为举例。
问题是 value -= 1
等同于 value = value - 1
。如您所见,必须在设置 value
之前计算 value - 1
,因此您的边界检查代码甚至没有机会 运行。即使它确实 运行,它也永远不会找到一个小于 0 的值来进行边界检查,因为你的 属性 是 UInt
.
如果您将 属性 更改为 Int
,这将按预期工作,甚至在 Cocoa 中也有使用 Int
的先例负数没有意义。 (但是,出于同样的原因,检查 Int.max
仍然毫无意义。)