使用 - = / + =调用计算属性的setter时的边界检查

时间:2017-04-26 00:24:47

标签: swift computed-properties

我正在尝试确保计算属性的setter仅在某个范围内设置 <div class="row"> <div class="col-sm-4" > <img class="img-responsive" src="cosmicveggie-banner2_01.jpg" width:"100%" > </div> <div class="col-sm-4" > <img class="img-responsive" src="cosmicveggie-banner2_02.jpg" width:"100%" ></div> <div class="col-sm-4"> <img class="img-responsive" src="cosmicveggie-banner2_03.jpg" width:"100%" ></div> 。计算属性的支持值为newValue

所以我认为我能做的就是使用UInt,如下所示:

min(max(newValue, 0), UInt.max)

但是当我使用for循环使用private var _value: UInt = 100 public var value: UInt { get { return _value } set { _value = min(max(newValue, 0), UInt.max) } } 递减值时,我抛出一个异常。

-=

似乎这没有做任何边界检查。有办法解决这个问题吗?

它必须是计算属性,所以我不能使用didSet。该属性实际上是其他值数组中值的别名。以上仅仅是为了举例。

1 个答案:

答案 0 :(得分:4)

问题在于value -= 1相当于value = value - 1。如您所见,value - 1必须在value设置之前计算,因此您的边界检查代码甚至都没有机会运行。即使它确实运行,它也永远不会找到小于0的值来进行边界检查,因为你的属性是UInt

如果您将属性更改为Int,这将按预期工作,即使在负数没有意义的情况下,Cocoa甚至还有一些使用Int的先例。 (但是,出于同样的原因,检查Int.max仍然毫无意义。)