Как оценивается 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 имеет некоторое значение, тогда необязательное значение распаковывается/назначается в константную переменную, т.е. Имя.