Могу ли я использовать оператор диапазона с оператором if в Swift?
можно ли использовать оператор диапазона ...
и ..<
с оператором if. Может быть что-то вроде этого:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
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