Как оценивается Swift IF LET?

Я видел этот код на сайте Swift и различные сообщения здесь, и я пытаюсь понять основы. Как оценивается эта строка?

if let name = optionalName {

Я запутался, так как это не имя == необязательное имя, оно присваивает значение, поэтому как это сообщение истинно и почему это не так, когда вы заменяете john appleseed на nil, так как он все равно будет равен?

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

Ответ 1

По сути, строка говорит: "Если вы можете позволить новой переменной name равняться нефактивной версии optionalName, сделайте следующее с ней". Как отметил Мартин, это называется Необязательное связывание.

Единственная цель - проверить, содержит ли факультативная переменная фактическое значение и привязать необязательную форму к временной переменной. Это безопасный способ "развернуть" необязательный или, другими словами, доступ к значению, содержащемуся в необязательном. Это ни в коем случае не является проверкой на равенство. Он тестирует только наличие значения в пределах необязательного.

Ответ 2

Необязательный либо установлен, либо не установлен... оставляя нам важное решение. "Как мы должны писать наш код, чтобы он мог корректно работать для двух состояний?". Способ, которым мы разворачиваем факультатив, - это то, что решает это для нас.

Существует несколько подходов, которые можно использовать для противопоставления необязательного параметра.

  • Краш!
  • Значение по умолчанию для чего-то - если оно не установлено.
  • Изящно сбой, т.е. ничего не делать, но также, если значение было установлено, затем назначьте его.
  • Изящно сбой, однако, если значение установлено... сделать что-то (это больше, чем одно назначение).

Ниже приведены 4 подхода


С помощью принудительной разворачивания произойдет сбой , если у вас нет значения. Вы хотели бы сделать это, если это значение имеет жизненно важное значение, например. название фильма (у каждого фильма должно быть имя). ! используется для принудительной разворачивания.

movieTitle = movie.title!

Использование nil coalescing - это еще один способ, который даст вам больше контроля, что означает, что он не сработает, если значение не задано, и оно не "ничего не установит", если оно не будет установлено... оно будет делать то, что вы говорите, например, он будет по умолчанию/установить имя фильма untitled_movie, если не было задано имя. ?? используется для объединения ниль.

var movieTitle = movie.title ?? "untitled_Movie"

Используя необязательный Chaining ничего не сделает , если у вас нет значения, и установите значение , если у вас есть значение. Вы делаете это для чего-то, что наличие его набора значений не имеет жизненно важного значения, например. для имени вашего агента-агента. ? используется для дополнительной привязки.

let agent = movie.leadActor?.agent //would not crash if you don't have a lead actor (optional chaining)
let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping)  

Используя if-let (или guard, которые представляют собой два разных типа необязательное связывание), вы получите больше управления, это не сработает, если значение не установлено. Если значение установлено, вы можете что-то сделать. Если он не установлен, вы можете добавить оператор else.

if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}

Это наиболее часто используемый способ разворачивания, поскольку принудительное разворачивание должно несколько обескураживаться. Для более подробной информации о том, почему это обескуражено, см. здесь. Для хорошего сравнения между guard и if-let см. guard vs. if-let


Боковое примечание:

Дополнительное связывание и необязательная цепочка обычно используются вместе:

if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
} // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining*

Ответ 3

Синтаксис if принимает два разных условия. Второе, необязательное связывание, не является логическим. Это сбивает с толку, поскольку вы можете написать:

если имя name = optionalName {

но не

if (let name = optionalName) {

cf Документация Apple (ссылка Swift):

Значение любого условия в операторе if должно иметь тип, соответствующий протоколу BooleanType. Условие также может быть необязательным объявлением связывания, как описано в необязательном привязке.

Ответ 4

Всякий раз, когда вы работаете со слабыми ссылками, необязательными типами, было бы лучше использовать, если бы вы могли безопасно защищать свой код и избегать сбоев Вот примеры

var middleName :String? = "some thing"
if let isExistsMiddleName = middleName {
// do some thing here
} else {
// no middle name
}

Ответ 5

if принимает только булевы выражения, кроме того, что он выдавал бы ошибку, поэтому этот фрагмент кода, говорящий

if let name = optionalName {

}else{

}

если optionalName равно nil, тогда условие будет false, а инструкция else будет выполнена. Однако, если optionalName имеет некоторое значение, тогда необязательное значение распаковывается/назначается в константную переменную, т.е. Имя.