Могу ли я использовать оператор диапазона с оператором if в Swift?


можно ли использовать оператор диапазона ... и ..< с оператором if. Может быть что-то вроде этого:

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

5 ответов:

вы можете использовать оператор "pattern-match"~=:

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

на самом деле никакой вызов функции не генерируется вообще, только три инструкции по сборке:

addq    $-200, %rdi
cmpq    , %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-Pattern matching in "если".

эта версия кажется более читаемой, чем сопоставление шаблонов:

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

Это старая тема, но мне кажется, что мы переосмысливаем это. Мне кажется, что лучший ответ-это просто

if statusCode >= 200 && statusCode <= 299

нет

if 200 > statusCode > 299

форма, о которой я знаю, и другие предлагаемые решения выполняют вызовы функций, которые будут медленнее и сложнее читать. Метод сопоставления шаблонов является полезным трюком, чтобы знать, но, похоже, плохо подходит для этой проблемы

Я хотел проверить 4xx ошибки, кроме 401. Вот код:

let i = 401

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

Я предложил диапазон .содержит () оператор тоже, пока не обнаружил, что его реализация неэффективна -https://oleb.net/blog/2015/09/swift-ranges-and-intervals/

мы можем представить условие x