Ifステートメントで範囲演算子...
および..<
を使用することは可能ですか?このようなメイ
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
「パターン一致」演算子~=
を使用できます。
if 200 ... 299 ~= statusCode {
print("success")
}
または、式パターンを持つswitch文(内部でpattern-match演算子を使用):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
..<
は上限値を省略した範囲を示すため、おそらく200 ... 299
または200 ..< 300
が必要になることに注意してください。
追加情報:上記のコードが最適化スイッチをオンにしてXcode 6.3でコンパイルされた場合、テスト用
if 200 ... 299 ~= statusCode
実際には関数呼び出しはまったく生成されず、3つのアセンブリ命令のみが生成されます。
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
これは、生成されるアセンブリコードとまったく同じです。
if statusCode >= 200 && statusCode <= 299
あなたはそれを確認することができます
xcrun -sdk macosx swiftc -O -emit-Assembly main.Swift
Swift 2、のように、これは
if case 200 ... 299 = statusCode {
print("success")
}
ifステートメントに新しく導入されたパターンマッチングを使用します。 Swift 2-"if"のパターンマッチング も参照してください。
このバージョンはパターンマッチングより読みやすいようです:
if (200 ... 299).contains(statusCode) {
print("Success")
}
これは古いスレッドですが、私にはこれを考え過ぎているようです。私には最高の答えはただ
if statusCode >= 200 && statusCode <= 299
ありません
if 200 > statusCode > 299
私が知っているフォーム、および他の提案されたソリューションは、より遅くなり読みにくい関数呼び出しを行っています。パターンマッチ法は知っておくと便利ですが、この問題にはあまり適していないようです
401以外の4xxエラーを確認したかった。コードは次のとおりです。
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Range .contains()演算子も、その実装が非効率であることが判明するまで、私は優先しました- https://oleb.net/blog/2015/09/Swift-ranges-and-intervals/
範囲を使用して条件x <0を表すことができます:(Int.min .. <0).contains(x)は完全に同等です。しかし、それは非常に遅いです。 contains(_ :)のデフォルトの実装はコレクション全体を走査し、最悪の場合ループを9兆回実行することは安くありません。