Как вы разворачиваете 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 nil

    • Unsafely разворачивать через параметр проходя:
      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)

нет необходимости разворачивать. Надеюсь, так и будет. помощь.