Могу ли я использовать оператор range с оператором 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-сопоставление шаблонов в "если".
эта версия кажется более читаемой, чем сопоставление шаблонов:
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")
}
Я предложил диапазон .оператор contains () тоже пока не обнаружил, что его реализация неэффективна -https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
мы можем представить условие x