Необязательный параметр установлен или не установлен (не nil или nil) ... что оставляет нам важное решение. «Как нам написать наш код, чтобы он мог корректно работать для двух состояний?». То, как мы разворачиваем необязательное, решает за нас.
Есть несколько подходов, которые вы можете использовать для противодействия неустановленному факультативу.
- Авария!
- Значение по умолчанию для чего-то - если оно не было установлено.
- Изящно завершиться ошибкой, т.е. ничего не делать, но также, если значение было установлено, присвоить его.
- Изящно завершиться неудачей, т.е. ничего не делать, однако, если значение было установлено ... сделайте что-нибудь (это просто больше, чем одно присвоение).
Ниже приведены 4 подхода
Использование принудительного развертывания приведет к сбою, если у вас нет значения. Вы захотите сделать это, если наличие этого значения имеет жизненно важное значение, например, название фильма (у каждого фильма ДОЛЖНО быть название). !
используется для принудительного разворачивания.
movieTitle = movie.title!
Использование nil coalescing - еще один способ, который даст вам больше контроля , что означает, что он не выйдет из строя, если значение не установлено, и он не будет `` ничего не устанавливать '', если он не установлен ... он будет делать то, что вы ему говорите например, если бы имя фильма не было задано, оно по умолчанию / установило бы имя фильма на untitled_movie . ??
используется для слияния нуля.
var movieTitle = movie.title ?? "untitled_Movie"
Использование необязательной цепочки ничего не даст, если у вас нет значения, и установит значение, если у вас есть значение. Вы делаете это для чего-то, установка значения которого не имеет большого значения, например, для имени агента вашего актера . ?
используется для необязательного связывания.
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
Использование 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
}