Есть ли в Котлине эквивалент приведенного ниже кода Swift?
if let a = b.val {
}
else {
}
Вы можете использовать эту let
функцию следующим образом:
val a = b?.let {
// If b is not null.
} ?: run {
// If b is null.
}
Обратите внимание, что вам нужно вызывать run
функцию, только если вам нужен блок кода. Вы можете удалить run
-block, если у вас есть только одна строка после elvis-operator ( ?:
).
Имейте в виду, что run
блок будет оценен либо если b
равен нулю, либо если let
-block оценивается как null
.
Из-за этого обычно требуется просто if
выражение.
val a = if (b == null) {
// ...
} else {
// ...
}
В этом случае else
-block будет оцениваться, только если b
не равен нулю.
a
нельзя получить доступ внутрьlet
иrun
заблокировать.a
еще не определен в рамкахlet
иrun
. Но вы можете получить доступ к значениюb
внутриlet
с помощью неявного параметраit
. Думаю, это служит той же цели.a
перед этими блоками кода. Иa
можно попасть внутрь.a
? Если даb
, тоit
служит той же цели. Переназначается лиa
с результатомval
-блока?it
изlet
блока. Результат блокаlet
илиrun
будет присвоенa
. Результатом будет последнее выражение в блоке. Вы можете использовать назначение послеlet
того, как /run
закончил, так же , как вы делаете с любым другим нормальным назначением.Давайте сначала убедимся, что мы понимаем семантику предоставленной идиомы Swift:
Это означает следующее: «если
<expr>
результатом является необязательный параметр,then
отличный от nil, введите -блок с символом,a
привязанным к развернутому значению. В противном случае введитеelse
блок.Особо обратите внимание, что
a
это связано только сthen
-block . В Котлине вы можете легко получить это, позвониви вы можете добавить
else
-блок следующим образом:Это приводит к той же семантике, что и идиома Swift.
источник
Мой ответ полностью копирует других. Однако я не могу легко понять их выражение. Думаю, было бы неплохо дать более понятный ответ.
Быстро:
В Котлине:
источник
let
вместоalso
означает, чтоrun
блок будет выполняться всякий раз, когдаlet
блок возвращаетсяnull
, а это не то, что мы хотим.В отличие от Swift, необязательно разворачивать дополнительный компонент перед его использованием в Kotlin. Мы могли бы просто проверить, не является ли значение ненулевым, и компилятор отслеживает информацию о выполненной вами проверке и позволяет использовать ее как развернутую.
В Swift:
В Котлине:
Обратитесь к документации: (нулевая безопасность) для получения дополнительных примеров использования
источник
if let
заявление.Swift
Optional Binding
(так называемыйif-let
оператор) используется, чтобы узнать, содержит ли необязательный параметр значение, и если да, то сделать это значение доступным как временную константу или переменную. Итак, операторOptional Binding
forif-let
выглядит следующим образом:В Kotlin, как и в Swift, чтобы избежать сбоев, вызванных попыткой доступа к нулевому значению, когда это не ожидается,
b.let { }
для правильного развертывания предоставляется специальный синтаксис (например, во втором примере)nullable types
:let
Функция Kotlin при использовании в сочетании с оператором безопасного вызова?:
предоставляет краткий способ обработки выражений, допускающих значение NULL.guard let
заявление.guard-let
Оператор Swift прост и эффективен. Он проверяет наличие некоторого условия, и если оно оказывается ложным,else
выполняется инструкция, которая обычно завершает метод.В отличие от Свифта, в Котлине нет никакого охранного заявления. Однако вы можете использовать
Elvis Operator
-?:
для получения аналогичного эффекта.Надеюсь это поможет.
источник
Вот как выполнить код, только если
name
он не равен нулю:источник
let
делает, но вопрос заключается вelse
стратегии, которая выполняется, если объект, для которогоlet
вызывается, являетсяnull
. Swift имеет его более естественным (спорного) способом. Но, сделав много работы как с Kotlin, так и с Swift, я действительно хочу, чтобы у Kotlin была простая распаковка, как у Swift.Вот мой вариант, ограниченный очень распространенным случаем «if not null».
Прежде всего, определите это где-нибудь:
Наверное, так и должно быть
internal
, чтобы не было конфликтов.Теперь преобразуйте этот код Swift:
К этому коду Котлина:
Обратите внимание, что, как всегда с блоками в Kotlin, вы можете отбросить аргумент и использовать
it
:Но если в блоке больше 1-2 строк, вероятно, лучше указать явно.
Это похоже на Swift, насколько я смог найти.
источник
В kotlin есть аналогичный способ достичь стиля Swift if-let
Вы также можете назначить несколько значений, допускающих значение NULL
Такой подход будет более подходящим, если значения, допускающие значение NULL, используются более 1 раза. На мой взгляд, это помогает с точки зрения производительности, потому что значение, допускающее значение NULL, будет проверяться только один раз.
источник: Kotlin Discussion
источник
Я добавляю этот ответ, чтобы прояснить принятый ответ, потому что он слишком велик для комментария.
Общий шаблон здесь заключается в том, что вы можете использовать любую комбинацию функций Scope, доступных в Kotlin, разделенных оператором Elvis, например:
Например:
источник
Самый чистый вариант на мой взгляд - это
Swift:
Котлин
источник
Короткий ответ: используйте простой IF-ELSE, поскольку на момент написания этого комментария эквивалента в Kotlin LET нет,
источник