Свифт Если пусть и еще в Котлине


в Котлине есть эквивалент Swift кода ниже?

if let a = b.val {

}
else {

}
3   51   2017-10-13 09:25:58

3 ответа:

можно использовать let-функция, как это:

val a = b?.let {
    // If b is not null.
} ?: run {
    // If b is null.
}

обратите внимание, что вам нужно позвонить в run функции только если вам нужен блок кода. Вы можете удалить run-блок, если у вас есть только одна строка после оператора elvis (?:).

имейте в виду, что run блок будет оцениваться либо если b null, или если let-блок оценивает в null.

из-за этого, вы обычно хотите просто if выражение.

val a = if (b == null) {
    // ...
} else {
    // ...
}

в этом случае else-блок будет оцениваться только если b имеет значение null.

давайте сначала убедимся, что мы понимаем семантику предоставленной идиомы Swift:

if let a = <expr> {
     // then-block
}
else {
     // else-block
}

это означает: "если <expr> результаты в non-nil необязательно, введите then-блок с символов a привязка к развернутому значению. В противном случае введите else заблокировать.

особенно обратите внимание, что a привязан только в thenблок. В Котлине вы можете легко получить это по телефону

<expr>?.also { a ->
    // then-block
}

и вы можете добавить else-блок такой:

<expr>?.also { a ->
    // then-block
} ?: run {
    // else-block
}

это приводит к той же семантике, что и идиома Swift. Тем не менее, есть еще разница в случае, если вы хотите рассматривать всю идиому как выражение и получить его результат, поэтому в Swift:

let result = if let a = <expr> {
    // then-block
}
else {
    // else-block
}

если result имеет необязательный тип, то вы можете использовать эту идиому:

val result = <expr>?.let { a ->
    // then-block
} ?: run {
    // else-block
}

он работает косвенным образом: мы вычисляем ненулевое значение, поэтому <expr>?.let {...} оценка для null означает <expr> оценка к null.

для полностью общего случая, который работает для нулевых результатов, я не мог найти естественный способ выразить это в Котлине без утечки a в область за пределами then-блок.

вот как только выполнить код, когда name не null:

var name: String? = null
name?.let { nameUnwrapp ->
    println(nameUnwrapp)  // not printed because name was null
}
name = "Alex"
name?.let { nameUnwrapp ->
    println(nameUnwrapp)  // printed "Alex"
}