È possibile utilizzare l'operatore di intervallo ...
e ..<
con l'istruzione if. Maye qualcosa del genere:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
È possibile utilizzare l'operatore di intervallo ...
e ..<
con l'istruzione if. Maye qualcosa del genere:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
Risposte:
È possibile utilizzare l'operatore "pattern-match" ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
O un'istruzione switch con un pattern di espressione (che utilizza internamente l'operatore pattern-match):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Si noti che ..<
indica un intervallo che omette il valore superiore, quindi probabilmente si desidera
200 ... 299
o 200 ..< 300
.
Ulteriori informazioni: quando il codice sopra è compilato in Xcode 6.3 con le ottimizzazioni attivate, quindi per il test
if 200 ... 299 ~= statusCode
in realtà non viene generata alcuna chiamata di funzione, solo tre istruzioni di assemblaggio:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
questo è esattamente lo stesso codice assembly che viene generato per
if statusCode >= 200 && statusCode <= 299
Puoi verificarlo con
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
A partire da Swift 2, questo può essere scritto come
if case 200 ... 299 = statusCode {
print("success")
}
usando il pattern-matching appena introdotto per le istruzioni if. Vedi anche Swift 2 - Pattern matching in "if" .
func ~= (Range<A>, A) -> Bool
viene chiamata una funzione di libreria . Vorrei pensare che questa funzione funziona con O (1).
xcrun -sdk macosx swift -emit-assembly main.swift
e ho ispezionato il codice assembly. Quindi ho usato xcrun swift-demangle ...
per decodificare il nome della funzione chiamata. - Sfortunatamente, Xcode non può ancora creare il codice assembly per i file Swift, forse funzionerà in una versione successiva.
Questa versione sembra essere più leggibile della corrispondenza dei modelli:
if (200 ... 299).contains(statusCode) {
print("Success")
}
Questo è un vecchio thread, ma mi sembra che ci stiamo pensando troppo. Mi sembra che la risposta migliore sia giusta
if statusCode >= 200 && statusCode <= 299
Non c'è
if 200 > statusCode > 299
di cui sono a conoscenza e le altre soluzioni suggerite stanno effettuando chiamate di funzione, che sono più difficili da leggere e potrebbero essere più lente da eseguire. Il metodo di corrispondenza del modello è un trucco utile da sapere, ma sembra inadatto a questo problema.
Personalmente, trovo che l'operatore di pattern match sia orribile e vorrei che il compilatore supportasse la if x in 1...100
sintassi. Questo è molto più intuitivo e facile da leggere diif 1...100 ~= x
if 200 ... 299 ~= statusCode
, nessuna chiamata di funzione :)
if 200 ... 299 ~= statusCode
fornisce lo stesso codice assembly diif statusCode >= 200 && statusCode <= 299
Volevo controllare gli errori 4xx tranne 401. Ecco il codice:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Ho preferito anche l'operatore Range .contains (), fino a quando non ho scoperto che la sua implementazione è inefficiente - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
Possiamo rappresentare la condizione x <0 usando un intervallo: (Int.min .. <0) .contains (x) è esattamente equivalente. Tuttavia è molto più lento. L'implementazione predefinita di contiene (_ :) attraversa l'intera raccolta e l'esecuzione di un ciclo di nove quintilioni di volte nel peggiore dei casi non è economica.