Я видел этот код на сайте Swift и в различных сообщениях здесь, и я пытаюсь понять основы. Как оценивается эта линия?
if let name = optionalName {
Я смущен, поскольку это не имя == необязательное имя, оно присваивает значение, так как этот отчет верен и почему он не соответствует действительности, когда вы заменяете john appleseed на nil, поскольку оно все равно будет равно?
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
if-statement
swift
DeadZero
источник
источник
if let
синтаксис известен как необязательная привязка.Ответы:
По сути, в строке говорится: «Если вы можете позволить новой переменной
name
равняться необязательной версииoptionalName
, сделайте с ней следующее». Как указал Мартин, это называется необязательной привязкой .Единственная цель этого - проверить, содержит ли необязательная переменная фактическое значение, и связать необязательную форму с временной переменной. Это безопасный способ «развернуть» необязательный элемент или, другими словами, получить доступ к значению, содержащемуся в необязательном. Это ни в коем случае не проверка на равенство любого рода. Это всего лишь проверка существования значения в необязательном.
источник
if let
мы привязываем значение к необязательной переменной (name
в этом примере). Ваш пример не компилируется, потому что теперь не вызывается переменнаяname
. Если вы измените свой пример на использование,optionalName
он будет распечатан какHello, Optional("John Appleseed")
. Вы можете использовать принудительное развертывание после проверки на nil,Hello, \(optionalName!)
но это просто более подвержено ошибкам, если вы переместите этот раздел кода куда-нибудь без проверки.Необязательный параметр установлен или не установлен (не nil или nil) ... что оставляет нам важное решение. «Как нам написать наш код, чтобы он мог корректно работать для двух состояний?». То, как мы разворачиваем необязательное, решает за нас.
Есть несколько подходов, которые вы можете использовать для противодействия неустановленному факультативу.
Ниже приведены 4 подхода
Использование принудительного развертывания приведет к сбою, если у вас нет значения. Вы захотите сделать это, если наличие этого значения имеет жизненно важное значение, например, название фильма (у каждого фильма ДОЛЖНО быть название).
!
используется для принудительного разворачивания.Использование nil coalescing - еще один способ, который даст вам больше контроля , что означает, что он не выйдет из строя, если значение не установлено, и он не будет `` ничего не устанавливать '', если он не установлен ... он будет делать то, что вы ему говорите например, если бы имя фильма не было задано, оно по умолчанию / установило бы имя фильма на untitled_movie .
??
используется для слияния нуля.var movieTitle = movie.title ?? "untitled_Movie"
Использование необязательной цепочки ничего не даст, если у вас нет значения, и установит значение, если у вас есть значение. Вы делаете это для чего-то, установка значения которого не имеет большого значения, например, для имени агента вашего актера .
?
используется для необязательного связывания.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*
источник
Синтаксис if принимает 2 разных условия. Вторая, необязательная привязка, не является логической. Это сбивает с толку, поскольку вы можете написать:
if let name = optionalName {
но нет
if (let name = optionalName) {
Документация Apple (ссылка на Swift):
источник
if
принимает только логические выражения, кроме того, что это вызовет ошибку, поэтому этот фрагмент кода говоритif let name = optionalName { }else{ }
если optionalName равно nil, тогда условие ложно и будет выполняться инструкция else. Однако, если optionalName имеет какое-то значение, то необязательное значение разворачивается / присваивается постоянной переменной, то есть name.
источник
Всякий раз, когда вы работаете со слабыми ссылками, необязательными типами было бы лучше использовать, если они позволяют надежно защитить ваш код и избежать сбоев Вот примеры
var middleName :String? = "some thing" if let isExistsMiddleName = middleName { // do some thing here } else { // no middle name }
источник