我正在尝试确保计算属性的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。该属性实际上是其他值数组中值的别名。以上仅仅是为了举例。
答案 0 :(得分:4)
问题在于value -= 1
相当于value = value - 1
。如您所见,value - 1
必须在value
设置之前计算,因此您的边界检查代码甚至都没有机会运行。即使它确实运行,它也永远不会找到小于0的值来进行边界检查,因为你的属性是UInt
。
如果您将属性更改为Int
,这将按预期工作,即使在负数没有意义的情况下,Cocoa甚至还有一些使用Int
的先例。 (但是,出于同样的原因,检查Int.max
仍然毫无意义。)