web-dev-qa-db-ja.com

Swiftのifステートメントで範囲演算子を使用できますか?

Ifステートメントで範囲演算子...および..<を使用することは可能ですか?このようなメイ

let statusCode = 204
if statusCode in 200 ..< 299 {
  NSLog("Success")
}
161
Jimmy

「パターン一致」演算子~=を使用できます。

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"のパターンマッチング も参照してください。

355
Martin R

このバージョンはパターンマッチングより読みやすいようです:

if (200 ... 299).contains(statusCode) {
    print("Success")
}
83

これは古いスレッドですが、私にはこれを考え過ぎているようです。私には最高の答えはただ

if statusCode >= 200 && statusCode <= 299

ありません

if 200 > statusCode > 299

私が知っているフォーム、および他の提案されたソリューションは、より遅くなり読みにくい関数呼び出しを行っています。パターンマッチ法は知っておくと便利ですが、この問題にはあまり適していないようです

8
Duncan C

401以外の4xxエラーを確認したかった。コードは次のとおりです。

let i = 401

if 400..<500 ~= i, i != 401 {
    print("yes")
} else {
    print("NO")
}
3

Range .contains()演算子も、その実装が非効率であることが判明するまで、私は優先しました- https://oleb.net/blog/2015/09/Swift-ranges-and-intervals/

範囲を使用して条件x <0を表すことができます:(Int.min .. <0).contains(x)は完全に同等です。しかし、それは非常に遅いです。 contains(_ :)のデフォルトの実装はコレクション全体を走査し、最悪の場合ループを9兆回実行することは安くありません。

1
Entro