Відповіді:
Ви можете використовувати оператор "відповідність шаблону" ~=
:
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 $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 - Узгодження шаблону в "якщо" .
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
синтаксис. Це sooooo набагато інтуїтивніше і легше для читання, ніжif 1...100 ~= x
if 200 ... 299 ~= statusCode
без виклику функцій :)
if 200 ... 299 ~= statusCode
дає той самий код складання, що іif statusCode >= 200 && statusCode <= 299
Я хотів перевірити 4xx помилки, крім 401. Ось код:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Я також віддав перевагу оператору Range .contains (), поки не виявив, що його реалізація неефективна - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
Ми можемо представити умову x <0, використовуючи діапазон: (Int.min .. <0) .contains (x) точно еквівалентний. Однак це набагато повільніше. Реалізація за замовчуванням містить (_ :) проходить всю колекцію, а виконання циклу дев'ять квінтільйонних разів у гіршому випадку недешево.