Sabemos que podemos usar uma if let
instrução como um atalho para verificar se há um nil opcional e depois desembrulhar.
No entanto, quero combinar isso com outra expressão usando o operador lógico AND &&
.
Então, por exemplo, aqui eu faço o encadeamento opcional para desempacotar e opcionalmente fazer o downcast do meu rootViewController para tabBarController. Mas, em vez de aninhar as instruções if, gostaria de combiná-las.
if let tabBarController = window!.rootViewController as? UITabBarController {
if tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Doação combinada:
if let tabBarController = window!.rootViewController as? UITabBarController &&
tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
O acima dá o erro de compilação Uso do identificador não resolvido 'tabBarController'
Simplificando:
if let tabBarController = window!.rootViewController as? UITabBarController && true {
println("do stuff")
}
Isso dá um erro de compilação. O valor de limite em uma associação condicional deve ser do tipo opcional . Tendo tentado várias variações sintáticas, cada uma fornece um erro de compilador diferente. Ainda estou para encontrar a combinação vencedora de ordem e parênteses.
Portanto, a questão é: é possível e, em caso afirmativo, qual é a sintaxe correta?
Observe que desejo fazer isso com uma if
declaração, não com uma switch
declaração ou com um ?
operador ternário .
fonte
var foo : Int? = 10; if let bar = foo { if bar == 10 { println("Great success!") }}
if let bar = foo && bar == 10
éUse of unresolved identifier "bar"
(no segundobar
, é claro).bridgeToObjectiveC
desapareceu no beta 5 (e muito possivelmente nunca foi planejado para uso geral). 2. De qualquer maneira, há umfirst
método noArray
tipo integrado do Swift .Respostas:
A partir do Swift 1.2, isso agora é possível . As notas de lançamento do Swift 1.2 e Xcode 6.3 beta afirmam:
Com a declaração acima, a sintaxe seria:
Isso usa a
where
cláusula.Outro exemplo, desta vez lançando
AnyObject
paraInt
, desembrulhando o opcional e verificando se o opcional desembrulhado atende à condição:Para aqueles que agora usam o Swift 3, "onde" foi substituído por uma vírgula. O equivalente seria, portanto:
fonte
No exemplo do Swift 3 Max MacLeod seria assim:
O
where
foi substituído por,
fonte
if let
só pode prosseguir se o opcional desembrulhar com sucesso e for atribuído ao novo nome de variável. Se você dissesseOR <something else>
, poderia facilmente ignorar todo o propósito doif let
. Para OR lógico, basta fazer um normalif
e dentro do corpo lidar com o fato de que o primeiro objeto ainda é opcional naquele ponto (não desembrulhado).A resposta de Max está correta e é uma maneira de fazer isso. Observe, porém, que quando escrito desta forma:
if let a = someOptional where someBool { }
A
someOptional
expressão será resolvida primeiro. Se falhar, asomeBool
expressão não será avaliada (avaliação de curto-circuito, como você esperaria).Se você quiser escrever ao contrário, pode ser feito assim:
if someBool, let a = someOptional { }
Nesse caso,
someBool
é avaliada primeiro, e somente se for avaliada como verdadeira asomeOptional
expressão é avaliada.fonte
Swift 4 , vou usar,
fonte
Não é possível.
Da gramática Swift
if-condição deve ser expressão ou declaração. Você não pode ter expressão e declaração.
let foo = bar
é uma declaração, não avalia para um valor em conformidade comBooleanType
. Ele declara uma constante / variávelfoo
.Sua solução original é boa o suficiente, é muito mais legível do que combinar as condições.
fonte
let foo = bar
é declaração, não expressão. você não pode fazerlet boolValue = (let foo = bar)
Acho que sua proposta original não é tão ruim. Uma alternativa (mais confusa) seria:
fonte
tabBarController
novamente