Jawaban:
Anda dapat menggunakan operator "pencocokan pola" ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
Atau pernyataan sakelar dengan pola ekspresi (yang menggunakan operator pencocokan pola secara internal):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Catatan yang ..<
menunjukkan rentang yang menghilangkan nilai atas, jadi Anda mungkin ingin
200 ... 299
atau 200 ..< 300
.
Informasi tambahan: Ketika kode di atas dikompilasi dalam Xcode 6.3 dengan optimisasi diaktifkan, maka untuk pengujian
if 200 ... 299 ~= statusCode
sebenarnya tidak ada panggilan fungsi yang dihasilkan sama sekali, hanya tiga instruksi perakitan:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
ini persis kode perakitan yang sama dengan yang dihasilkan
if statusCode >= 200 && statusCode <= 299
Anda dapat memverifikasi itu dengan
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
Pada Swift 2, ini dapat ditulis sebagai
if case 200 ... 299 = statusCode {
print("success")
}
menggunakan pencocokan pola yang baru diperkenalkan untuk pernyataan if. Lihat juga Swift 2 - Pencocokan pola dalam "jika" .
func ~= (Range<A>, A) -> Bool
dipanggil. Saya akan berasumsi bahwa fungsi ini berfungsi dengan O (1).
xcrun -sdk macosx swift -emit-assembly main.swift
dan memeriksa kode assembly. Kemudian saya biasa xcrun swift-demangle ...
memotong-motong nama fungsi yang dipanggil. - Sayangnya, Xcode belum dapat membuat kode rakitan untuk file Swift, mungkin ini akan bekerja di versi yang lebih baru.
Versi ini tampaknya lebih mudah dibaca daripada pencocokan pola:
if (200 ... 299).contains(statusCode) {
print("Success")
}
Ini adalah utas lama, tetapi bagi saya sepertinya kita terlalu memikirkan ini. Menurut saya jawaban yang terbaik adalah adil
if statusCode >= 200 && statusCode <= 299
Tidak ada
if 200 > statusCode > 299
bentuk yang saya sadari, dan solusi lain yang disarankan adalah melakukan pemanggilan fungsi, yang lebih sulit dibaca, dan mungkin lebih lambat untuk dijalankan. Metode pencocokan pola adalah trik yang berguna untuk diketahui, tetapi tampaknya tidak cocok untuk masalah ini.
Secara pribadi, saya menemukan operator pencocokan pola menjadi mengerikan, dan berharap kompiler akan mendukung if x in 1...100
sintaks. Itu sooooo jauh lebih intuitif dan mudah dibaca daripadaif 1...100 ~= x
if 200 ... 299 ~= statusCode
, tidak ada panggilan fungsi :)
if 200 ... 299 ~= statusCode
memberikan kode perakitan yang sama denganif statusCode >= 200 && statusCode <= 299
Saya ingin memeriksa kesalahan 4xx kecuali 401. Berikut adalah kodenya:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Saya lebih suka operator Range .contains (), sampai menemukan bahwa implementasinya tidak efisien - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
Kita dapat mewakili kondisi x <0 menggunakan rentang: (Int.min .. <0) .contains (x) persis sama. Ini jauh lebih lambat. Implementasi default berisi (_ :) melintasi seluruh koleksi, dan menjalankan loop sembilan quintillion kali dalam kasus terburuk tidak murah.