Czy można użyć operatora zakresu ...
i ..<
instrukcji if. Maye coś takiego:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
źródło
Czy można użyć operatora zakresu ...
i ..<
instrukcji if. Maye coś takiego:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
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łemxcrun 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:
źródło
To stary wątek, ale wydaje mi się, że przesadzamy. Wydaje mi się, że najlepsza odpowiedź jest słuszna
Nie ma
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.
Edytować:
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
źródło
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:
źródło
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/
źródło