ObjecTips

Swift & Objective-C で iOS とか macOS とか

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 を使ったパターン
肝は FloatingPointnextUpnextDown
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:ドキュメントの記載場所は見当たらなかった。どこかに書いてあるんだろうけど。。