Respostas:
Você pode usar o operador "correspondência de padrão" ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
Ou uma instrução switch com um padrão de expressão (que usa o operador de correspondência de padrões internamente):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Observe que ..<
denota um intervalo que omite o valor superior, então você provavelmente deseja
200 ... 299
ou 200 ..< 300
.
Informações adicionais: Quando o código acima é compilado no Xcode 6.3 com as otimizações ativadas, então para o teste
if 200 ... 299 ~= statusCode
na verdade, nenhuma chamada de função é gerada, apenas três instruções de montagem:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
este é exatamente o mesmo código de montagem que é gerado para
if statusCode >= 200 && statusCode <= 299
Você pode verificar se, com
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
A partir do Swift 2, isso pode ser escrito como
if case 200 ... 299 = statusCode {
print("success")
}
usando a recém-introduzida correspondência de padrões para instruções if. Veja também Swift 2 - Correspondência de padrões em "se" .
func ~= (Range<A>, A) -> Bool
é chamada. Eu assumiria que esta função funciona com O (1).
xcrun -sdk macosx swift -emit-assembly main.swift
e inspecionei o código de montagem. Então eu costumava xcrun swift-demangle ...
desmembrar o nome da função chamada. - Infelizmente, o Xcode ainda não pode criar código de montagem para arquivos Swift, talvez funcione em uma versão posterior.
Esta versão parece ser mais legível do que a correspondência de padrões:
if (200 ... 299).contains(statusCode) {
print("Success")
}
Este é um tópico antigo, mas parece-me que estamos pensando demais nisso. Parece-me que a melhor resposta é apenas
if statusCode >= 200 && statusCode <= 299
Não há
if 200 > statusCode > 299
que eu conheço e as outras soluções sugeridas estão fazendo chamadas de função, que são mais difíceis de ler e podem ser mais lentas de executar. O método de correspondência de padrões é um truque útil, mas parece um ajuste inadequado para esse problema.
Pessoalmente, acho o operador de correspondência de padrões hediondo e desejo que o compilador suporte a if x in 1...100
sintaxe. Isso é muuuito mais intuitivo e fácil de ler do queif 1...100 ~= x
if 200 ... 299 ~= statusCode
, nenhuma chamada de função :)
if 200 ... 299 ~= statusCode
dá o mesmo código de montagem queif statusCode >= 200 && statusCode <= 299
Eu queria verificar os erros 4xx, exceto 401. Aqui está o código:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Também preferi o operador Range .contains (), até descobrir que sua implementação é ineficiente - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
Podemos representar a condição x <0 usando um intervalo: (Int.min .. <0) .contains (x) é exatamente equivalente. É muito mais lento, no entanto. A implementação padrão de contains (_ :) percorre toda a coleção, e executar um loop nove quintilhões de vezes no pior caso não é barato.