switch style statement removed has functions for example been array if-statement swift range

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") }