2017-04-26 11 views
2

调用计算属性的设置器时的边界检查我试图确保计算属性的设置器只在某个范围内设置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。该属性实际上是其他值数组中值的别名。以上仅仅是为了举例。

+1

您正在从0 Uint减去1。你期望会发生什么? – Alexander

回答

3

问题是value -= 1等于value = value - 1。正如你所看到的,value - 1必须在value之前进行计算,所以你的边界检查代码甚至没有机会运行。即使它运行,它也不会找到一个小于0的值来检查边界,因为你的属性是UInt

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