Apakah mungkin untuk menggunakan operator jangkauan ...
dan ..<
dengan pernyataan if. Mungkin sesuatu seperti ini:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
sumber
Apakah mungkin untuk menggunakan operator jangkauan ...
dan ..<
dengan pernyataan if. Mungkin sesuatu seperti ini:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
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 biasaxcrun 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:
sumber
Ini adalah utas lama, tetapi bagi saya sepertinya kita terlalu memikirkan ini. Menurut saya jawaban yang terbaik adalah adil
Tidak ada
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.
Edit:
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
sumber
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:
sumber
Saya lebih suka operator Range .contains (), sampai menemukan bahwa implementasinya tidak efisien - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
sumber