É possível usar o operador de faixa ...
e ..<
com a instrução if. Maye algo como isto:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
fonte
É possível usar o operador de faixa ...
e ..<
com a instrução if. Maye algo como isto:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
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 costumavaxcrun 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:
fonte
Este é um tópico antigo, mas parece-me que estamos pensando demais nisso. Parece-me que a melhor resposta é apenas
Não há
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.
Editar:
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
fonte
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:
fonte
Também preferi o operador Range .contains (), até descobrir que sua implementação é ineficiente - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
fonte