Как вы разворачиваете Swift optionals?
как вы правильно разворачиваете как обычные, так и неявные опциональные?
в этой теме, похоже, есть путаница, и я просто хотел бы иметь ссылку на все способы и как они полезны.
В настоящее время существует два способа создания optionals:
var optionalString: String?
var implicitOptionalString: String!
каковы все способы развернуть оба? Кроме того, в чем разница между использованием ! и ? во время распаковки?
3 ответов
есть много сходств и только несколько различий.
(Регулярные) Optionals
объявления:
var opt: Type?небезопасно разворачивающий:
let x = opt!.property // error if opt is nilбезопасное тестирование наличие :
if opt != nil { ... someFunc(opt!) ... } // no errorбезопасно разворачивать через вязку:
if let x = opt { ... someFunc(x) ... } // no errorбезопасное сцепление:
var x = opt?.property // x is also Optional, by extensionбезопасно коалесцирующий значения nil:
var x = opt ?? nonOpt
Неявно Развернутые Optionals
объявления:
var opt: Type!-
небезопасно разворачивать (неявно):
let x = opt.property // error if opt is nilнебезопасно разворачивать через назначение:
let nonOpt: Type = opt // error if opt is nilUnsafely разворачивать через параметр проходя:
func someFunc(nonOpt: Type) ... someFunc(opt) // error if opt is nil
безопасное тестирование существование:
if opt != nil { ... someFunc(opt) ... } // no errorбезопасное сцепление:
var x = opt?.property // x is also Optional, by extensionбезопасно срастанию значения nil:
var x = opt ?? nonOpt
С бета-версии 5 у нас также есть новый оператор объединения (??):
var a : Int?
let b : Int = a ?? 0
если необязательный != nil он развернут, иначе используется значение справа от оператора
необязательный тип означает, что переменная может быть nil.
пример:
var myString: Int? = 55
myString = nil
знак вопроса указывает, что он может иметь нулевое значение.
но если вы заявляете такой:
var myString : Int = 55
myString = nil
он покажет ошибку.
теперь, чтобы получить значение, вам нужно развернуть его:
print(myString!)
но если вы хотите развернуть автоматически:
var myString: Int! = 55
затем:
print(myString)
нет необходимости разворачивать. Надеюсь, так и будет. помощь.