回答:
「パターン一致」演算子を使用できます~=
。
if 200 ... 299 ~= statusCode {
print("success")
}
または、式パターン(内部でパターンマッチ演算子を使用する)を含むswitchステートメント:
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ステートメントに新しく導入されたパターンマッチングを使用します。「if」のSwift 2-パターンマッチングも参照してください。
func ~= (Range<A>, A) -> Bool
が呼び出されていることがわかります。この関数はO(1)で機能すると仮定します。
xcrun -sdk macosx swift -emit-assembly main.swift
、アセンブリコードを検査しました。次にxcrun swift-demangle ...
、呼び出された関数の名前をデマングルしました。-残念ながら、XcodeはまだSwiftファイルのアセンブリコードを作成できません。おそらくそれ以降のバージョンで動作するでしょう。
このバージョンは、パターンマッチングよりも読みやすいようです。
if (200 ... 299).contains(statusCode) {
print("Success")
}
これは古いスレッドですが、考えすぎているようです。私には最良の答えは
if statusCode >= 200 && statusCode <= 299
ありません
if 200 > statusCode > 299
私が知っているフォーム、および他の提案されたソリューションは、関数呼び出しを行っています。これは読みにくく、実行が遅くなる可能性があります。パターンマッチの方法は知っておくと便利ですが、この問題にはあまり適していません。
個人的には、パターンマッチ演算子は恐ろしいと思うので、コンパイラーがif x in 1...100
構文をサポートすることを願っています。それは非常に直感的で読みやすいですif 1...100 ~= x
if 200 ... 299 ~= statusCode
関数呼び出しはありません:)
if 200 ... 299 ~= statusCode
に同じアセンブリコードを提供しますif statusCode >= 200 && statusCode <= 299
401以外の4xxエラーを確認したいと思います。コードは次のとおりです。
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
その実装は非効率的であることが判明するまで、私は、あまりにも範囲.contains()演算子を優先- https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
範囲を使用して、条件x <0を表すことができます:(Int.min .. <0).contains(x)はまったく同じです。しかし、それは非常に遅いです。contains(_ :)のデフォルトの実装は、コレクション全体を走査します。最悪の場合、ループを9千億回実行するのは安くはありません。