使用 -=/+= 调用计算 属性 的 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 仍然毫无意义。)