Yanıtlar:
"Kalıp eşleşmesi" operatörünü kullanabilirsiniz ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
Veya ifade modelli bir anahtar deyimi (dahili olarak desen eşleme işlecini kullanır):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Not ..<
atlar üst değeri, bu nedenle muhtemelen istediğiniz bir dizi gösterir
200 ... 299
veya 200 ..< 300
.
Ek bilgi: Yukarıdaki kod, optimizasyon açıkken Xcode 6.3'te derlendiğinde, test için
if 200 ... 299 ~= statusCode
aslında hiçbir işlev çağrısı üretilmez, sadece üç montaj talimatı:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
bu tam olarak aynı derleme kodudur.
if statusCode >= 200 && statusCode <= 299
İle doğrulayabilirsiniz
xcrun -sdk macosx swiftc -O -emit-montaj main.swift
Swift 2'den itibaren, bu şu şekilde yazılabilir
if case 200 ... 299 = statusCode {
print("success")
}
if ifadeleri için yeni tanıtılan desen eşleştirmeyi kullanarak. Ayrıca bkz. Swift 2 - "if" de desen eşleştirme .
func ~= (Range<A>, A) -> Bool
çağrıldığını görebilirsiniz. Ben ediyorum varsayalım bu fonksiyon O (1) ile çalışır.
xcrun -sdk macosx swift -emit-assembly main.swift
ve montaj kodunu inceledim. Sonra xcrun swift-demangle ...
, çağrılan işlevin adını değiştirirdim. - Ne yazık ki, Xcode Swift dosyaları için henüz montaj kodu oluşturamıyor, belki daha sonraki bir sürümde çalışacak.
Bu sürüm, desen eşleşmesinden daha okunabilir görünüyor:
if (200 ... 299).contains(statusCode) {
print("Success")
}
Bu eski bir konu, ama bana öyle geliyor ki, bunu fazla düşünüyoruz. Bana öyle geliyor ki en iyi cevap sadece
if statusCode >= 200 && statusCode <= 299
Orada hiçbir
if 200 > statusCode > 299
ve diğer önerilen çözümler okunması daha zor olan ve yürütülmesi daha yavaş olabilecek işlev çağrıları yapıyor. Kalıp eşleştirme yöntemi, bilmek için yararlı bir numaradır, ancak bu soruna zayıf bir uyum gibi görünüyor.
Şahsen, desen eşleştirme operatörünü iğrenç buluyorum ve derleyicinin if x in 1...100
sözdizimini desteklemesini diliyorum . Bu sooooo çok daha sezgisel ve okunması kolayif 1...100 ~= x
if 200 ... 299 ~= statusCode
, işlev çağrısı yok :)
if 200 ... 299 ~= statusCode
veririf statusCode >= 200 && statusCode <= 299
401 hariç 4xx hatalarını kontrol etmek istedim. İşte kod:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Uygulamasının verimsiz olduğunu bulana kadar Range .contains () operatörünü de tercih ettim - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
X <0 koşulunu bir aralık kullanarak temsil edebiliriz: (Int.min .. <0) .contains (x) tam olarak eşdeğerdir. Yine de oldukça yavaş. İnclude (_ :) öğesinin varsayılan uygulaması tüm koleksiyonda gezer ve en kötü durumda dokuz çeyrek milyon kez bir döngü yürütmek ucuz değildir.