2017-04-26 3 views
2

を使用して計算されたプロパティのセッターを呼び出すときの境界チェック計算されたプロパティのセッターが特定の範囲内の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) } 
} 

しかし。

for _ in 0..<1000 { 
    value -= 1 
} 

これは境界チェックを行わないようです。これを回避する方法はありますか?

私はdidSetを使うことができないので、これは計算されたプロパティでなければなりません。このプロパティは、実際には他の値の配列内の値の別名です。上記は単なる例である。

+1

0 Uintから1を引いています。何が起こると思いますか? – Alexander

答えて

3

value -= 1value = value - 1に相当します。ご覧のとおり、を設定する前にvalue - 1を計算する必要があります。そのため、境界チェックコードでは決して実行することはできません。たとえ実行されたとしても、プロパティーがUIntであるため、bounds-checkに0より小さい値を見つけることはありません。

プロパティをIntに変更した場合、これは意図したとおりに機能し、負の数値が意味を成さない場合でもIntを使用するためのいくつかの前例がCocoaにあります。ただし、同じ理由でInt.maxと照合するのは無意味です。