Swift での範囲内の数値の判定バリエーション
Comparison operator + logical AND operator
他の言語と同じ < > <= >= && を使うパターン
| 条件 | 比較演算子+論理和演算子 |
|---|---|
| 0以上1以下 | if 0.0 <= value && value <= 1.0 |
| 0以上1未満 | if 0.0 <= value && value < 1.0 |
| 0超え1以下 | if 0.0 < value && value <= 1.0 |
| 0超え1未満 | if 0.0 < value && value < 1.0 |
Comparison Operator
https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html#ID70
Logical AND Operator
https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html#ID78
Comparison operator + comma
Swift ではカンマ , で条件を列挙できる *1
| 条件 | 比較演算子+論理演算子 |
|---|---|
| 0以上1以下 | if 0.0 <= value, value <= 1.0 |
| 0以上1未満 | if 0.0 <= value, value < 1.0 |
| 0超え1以下 | if 0.0 < value, value <= 1.0 |
| 0超え1未満 | if 0.0 < value, value < 1.0 |
Range + nextUp, nextDown
もう一つ Swift で Range ClosedRange を使ったパターン
肝は FloatingPoint の nextUp と nextDown
nextUp はその値より大きい最も小さな値
nextDown はその値より小さい最も大きな値
| 条件 | Range+nextUp(Down)+パターンマッチング |
|---|---|
| 0以上1以下 | if case 0.0...1.0 = value |
| 0以上1未満 | if case 0.0..<1.0 = value |
| 0超え1以下 | if case 0.0.nextUp...1.0 = value |
| 0超え1未満 | if case 0.0.nextUp..<1.0 = value |
| 0超え1未満 | if case 0.0.nextUp...1.0.nextDown = value |
ちなみに、「対象の値」と「対象の値より大きい最も小さな値」の差分って何?
nextUp nextDown によってどう値が変化するの?
という疑問への答えは以下。
0.0.nextUp == .leastNonzeroMagnitude // true
覚えてしまえば1つの条件式で書けてしまうので楽かも?
Range (half-open range)
https://developer.apple.com/documentation/swift/range
ClosedRange
https://developer.apple.com/documentation/swift/closedrange
nextUp
https://developer.apple.com/documentation/swift/floatingpoint/1848104-nextup
nextDown
https://developer.apple.com/documentation/swift/floatingpoint/3017979-nextdown
leastNonzeroMagnitude
https://developer.apple.com/documentation/swift/floatingpoint/1848591-leastnonzeromagnitude
追記
Range + nextUp, nextDown + ~=
記事を見たiOSエンジニアの人から他のパターンも教えてもらった
if case 0.0...1.0 = value
これを演算子 ~= を使って
if 0.0...1.0 ~= value
と置き換え可能との事。
置き換え版は以下
| 条件 | Range+nextUp(Down)+パターンマッチング |
|---|---|
| 0以上1以下 | if 0.0...1.0 ~= value |
| 0以上1未満 | if 0.0..<1.0 ~= value |
| 0超え1以下 | if 0.0.nextUp...1.0 ~= value |
| 0超え1未満 | if 0.0.nextUp..<1.0 ~= value |
| 0超え1未満 | if 0.0.nextUp...1.0.nextDown ~= value |
Appleのドキュメントによれば ~= はパターンマッチング演算子 (pattern-matching operator) で
case statement の書き方のパターンマッチングは内部でこの演算子を使用しているらしい。
勉強になった。
~=(::)
https://developer.apple.com/documentation/swift/1539154
*1:ドキュメントの記載場所は見当たらなかった。どこかに書いてあるんだろうけど。。