if-statement - style - switch swift example
¿Puedo usar el operador de rango con la instrucción if en Swift? (5)
Este es un hilo viejo, pero me parece que estamos pensando demasiado en esto. Me parece que la mejor respuesta es solo
if statusCode >= 200 && statusCode <= 299
No hay
if 200 > statusCode > 299
forma de la que soy consciente, y las otras soluciones sugeridas están haciendo llamadas a funciones, que serán más lentas y difíciles de leer. El método de coincidencia de patrones es un truco útil para saber, pero parece ser un mal ajuste para este problema
¿Es posible usar el operador de rango ...
y ..<
con la instrucción if? Maye algo como esto:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
Prefiero el operador Range .contains () también, hasta que descubrí que su implementación es ineficiente - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
Podemos representar la condición x <0 usando un rango: (Int.min .. <0) .contains (x) es exactamente equivalente. Sin embargo, es mucho más lento. La implementación predeterminada de contains (_ :) atraviesa toda la colección, y ejecutar un loop nueve trillones de veces en el peor de los casos no es barato.
Puede usar el operador "pattern-match" ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
O una declaración de cambio con un patrón de expresión (que usa el operador de coincidencia de patrón internamente):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Tenga en cuenta que ..<
denota un rango que omite el valor superior, por lo que probablemente desee 200 ... 299
o 200 ..< 300
.
Información adicional: cuando el código anterior se compila en Xcode 6.3 con las optimizaciones enciéndalo, entonces para la prueba
if 200 ... 299 ~= statusCode
en realidad, no se genera ninguna llamada de función, solo tres instrucciones de ensamblaje:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
este es exactamente el mismo código de ensamblaje que se genera para
if statusCode >= 200 && statusCode <= 299
Puedes verificar eso con
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
A partir de Swift 2, esto se puede escribir como
if case 200 ... 299 = statusCode {
print("success")
}
usando la coincidencia de patrones recientemente introducida para sentencias if. Ver también Swift 2 - Coincidencia de patrones en "si" .
Quería verificar errores 4xx excepto 401. Aquí está el código:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Esta versión parece ser más legible que la coincidencia de patrones:
if (200 ... 299).contains(statusCode) {
print("Success")
}