Em Kotlin, existe um equivalente ao código Swift abaixo?
if let a = b.val {
}
else {
}
Você pode usar a let
função-assim:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
Observe que você precisa chamar a run
função apenas se precisar de um bloco de código. Você pode remover o run
-block se tiver apenas um oneliner após o operador-elvis ( ?:
).
Esteja ciente de que o run
bloco será avaliado se b
for nulo ou se o let
-block for avaliado como null
.
Por causa disso, você geralmente quer apenas uma if
expressão.
val a = if (b == null) {
// ...
} else {
// ...
}
Nesse caso, o else
-block só será avaliado se b
não for nulo.
a
não pode ser acessado dentrolet
erun
bloco.a
ainda não está definido dentro do escopo delet
erun
. Mas você pode acessar o valor deb
dentro delet
com o parâmetro implícitoit
. Isso tem o mesmo propósito, eu acho.a
antes desses blocos de código. Ea
pode ser acessado por dentro.a
? Se forb
, entãoit
tem exatamente o mesmo propósito. Ele reatribuia
com o resultado doval
-block?it
de dentro dolet
bloco. O resultado do blocolet
ourun
será atribuído aa
. O resultado é a última expressão do bloco. Você usa a tarefa apóslet
/run
terminar, como faria com qualquer outra tarefa normal.Vamos primeiro garantir que entendemos a semântica do idioma Swift fornecido:
Significa o seguinte: "se o
<expr>
resultado for um opcional não nulo, insira othen
-bloco com o símboloa
vinculado ao valor não empacotado. Caso contrário, insira oelse
bloco.Observe especialmente que
a
está vinculado apenas aothen
bloco -block . Em Kotlin, você pode fazer isso facilmente chamandoe você pode adicionar um
else
-bloco como este:Isso resulta na mesma semântica do idioma Swift.
fonte
Minha resposta é totalmente uma cópia dos outros. No entanto, não consigo entender sua expressão facilmente. Acho que seria bom fornecer uma resposta mais compreensível.
Rapidamente:
Em Kotlin:
fonte
let
vez dealso
significa que orun
bloco será executado sempre que olet
bloco retornarnull
, o que não é o que queremos.Ao contrário do Swift, não é necessário desembrulhar o opcional antes de usá-lo no Kotlin. Poderíamos apenas verificar se o valor não é nulo e o compilador rastreia as informações sobre a verificação que você executou e permite usá-la como desembrulhada.
Em Swift:
Em Kotlin:
Consulte a Documentação: (segurança nula) para mais casos de uso
fonte
if let
declaração.O Swift's
Optional Binding
(a chamadaif-let
instrução) é usado para descobrir se um opcional contém um valor e, em caso afirmativo, para disponibilizar esse valor como uma constante ou variável temporária. Portanto, umOptional Binding
para aif-let
declaração é o seguinte:No Kotlin, como no Swift, para evitar travamentos causados ao tentar acessar um valor nulo quando não é esperado, uma sintaxe específica (como
b.let { }
no segundo exemplo) é fornecida para desempacotar corretamentenullable types
:A
let
função de Kotlin , quando usada em combinação com o operador de chamada segura?:
, fornece uma maneira concisa de lidar com expressões anuláveis.guard let
declaração.guard-let
declaração em Swift é simples e poderosa. Ele verifica se há alguma condição e, se for avaliada como falsa, aelse
instrução é executada, normalmente encerrando um método.Ao contrário de Swift, em Kotlin, não há nenhuma instrução de guarda . No entanto, você pode usar
Elvis Operator
-?:
para obter um efeito semelhante.Espero que isto ajude.
fonte
Veja como executar código apenas quando
name
não for nulo:fonte
let
faz, mas a questão é sobre aelse
estratégia que executa se o objeto no quallet
é chamado o fornull
. Swift tem isso de forma mais natural (discutível). Mas, tendo feito muito Kotlin e Swift, gostaria que Kotlin tivesse um desembrulhamento simples como o Swift faz.Aqui está minha variante, limitada ao caso muito comum "se não nulo".
Em primeiro lugar, defina isso em algum lugar:
Provavelmente deveria ser
internal
, para evitar conflitos.Agora, converta este código Swift:
Para este código Kotlin:
Observe que, como sempre acontece com blocos em Kotlin, você pode descartar o argumento e usar
it
:Mas se o bloco tiver mais de 1-2 linhas, provavelmente é melhor ser explícito.
É o mais semelhante ao Swift que pude encontrar.
fonte
Existe uma maneira semelhante no kotlin para alcançar o estilo do Swift se-let
Você também pode atribuir vários valores anuláveis
Esse tipo de abordagem será mais adequado se os valores anuláveis forem usados por mais de 1 vez. Na minha opinião, ajuda do aspecto de desempenho porque o valor anulável será verificado apenas uma vez.
fonte: Discussão de Kotlin
fonte
Estou adicionando esta resposta para esclarecer a resposta aceita porque é muito grande para um comentário.
O padrão geral aqui é que você pode usar qualquer combinação das Funções de Escopo disponíveis no Kotlin separadas pelo Operador Elvis assim:
Por exemplo:
fonte
A opção mais limpa na minha opinião é esta
Rápido:
Kotlin
fonte
A resposta curta é usar IF-ELSE simples , pois no momento deste comentário não há equivalente no Kotlin LET,
fonte