Odpowiedzi:
Możesz użyć operatora „dopasuj wzór” ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
Lub instrukcja switch z wzorcem wyrażenia (który wewnętrznie korzysta z operatora dopasowywania wzorców):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Zauważ, że ..<
oznacza zakres pomijający górną wartość, więc prawdopodobnie chcesz
200 ... 299
lub 200 ..< 300
.
Informacje dodatkowe: Gdy powyższy kod zostanie skompilowany w Xcode 6.3 z włączonymi optymalizacjami, to do testu
if 200 ... 299 ~= statusCode
właściwie nie jest generowane żadne wywołanie funkcji, tylko trzy instrukcje asemblera:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
jest to dokładnie ten sam kod zestawu, który jest generowany
if statusCode >= 200 && statusCode <= 299
Możesz to sprawdzić za pomocą
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
Od wersji Swift 2 można to zapisać jako
if case 200 ... 299 = statusCode {
print("success")
}
używając nowo wprowadzonego dopasowania wzorca dla instrukcji if. Zobacz także Swift 2 - Dopasowywanie wzorców w „if” .
func ~= (Range<A>, A) -> Bool
wywoływana jest funkcja biblioteki . Chciałbym założyć, że funkcja ta działa z O (1).
xcrun -sdk macosx swift -emit-assembly main.swift
i sprawdziłem kod asemblera. Potem zwykłem xcrun swift-demangle ...
rozplątywać nazwę wywoływanej funkcji. - Niestety, Xcode nie może jeszcze utworzyć kodu asemblera dla plików Swift, być może zadziała w późniejszej wersji.
Ta wersja wydaje się bardziej czytelna niż dopasowanie wzorca:
if (200 ... 299).contains(statusCode) {
print("Success")
}
To stary wątek, ale wydaje mi się, że przesadzamy. Wydaje mi się, że najlepsza odpowiedź jest słuszna
if statusCode >= 200 && statusCode <= 299
Nie ma
if 200 > statusCode > 299
Formularz, który znam, a inne sugerowane rozwiązania wykonują wywołania funkcji, które są trudniejsze do odczytania i mogą być wolniejsze do wykonania. Metoda dopasowania do wzorca jest użyteczną sztuczką, którą należy wiedzieć, ale wydaje się, że nie pasuje do tego problemu.
Osobiście uważam, że operator dopasowania wzorca jest ohydny i chciałbym, żeby kompilator obsługiwał if x in 1...100
składnię. To jest o wiele bardziej intuicyjne i łatwe do odczytania niżif 1...100 ~= x
if 200 ... 299 ~= statusCode
, brak wywołania funkcji :)
if 200 ... 299 ~= statusCode
podaje ten sam kod asemblera coif statusCode >= 200 && statusCode <= 299
Chciałem sprawdzić błędy 4xx oprócz 401. Oto kod:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Wolałem też operatora Range .contains (), dopóki nie stwierdziłem, że jego implementacja jest nieefektywna - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
Możemy przedstawić warunek x <0 za pomocą zakresu: (Int.min .. <0). Contains (x) jest dokładnie równoważne. Jest jednak znacznie wolniejszy. Domyślna implementacja zawiera (_ :) przegląda całą kolekcję, a wykonanie pętli dziewięć kwintillionów w najgorszym przypadku nie jest tanie.