Ответ 1
Короче говоря, (ответ на заголовок) это не так.
Подробнее:
Для меня гораздо более важно иметь его как необязательный, который не принудительно разворачивается. Apple нажимает на разработчиков, чтобы никогда не использовать optional!
, и имеет смысл только то, что они применяют те же правила к API.
Причиной этого является то, что он может быть равен нулю, и это не имеет никакого значения, если он объявлен с помощью ?
или !
для запуска кода. Использование !
фактически просто удаляет предупреждения в Xcode, которые действительно удобны, особенно когда дело доходит до кода API. Если вы не понимаете, что на самом деле это необязательно, вы просто просите о проблемах.
Проверка на nil также намного удобнее теперь с guard
, и вы можете связать это с проверкой на ""
, чтобы она больше не работала.
В общем случае опции лучше, потому что что-то, что нет, не использует память. Чем больше вариантов мы получили, тем легче мы можем сделать наши приложения. Также он даже не выглядит плохим и не добавляет к пирамиде обреченности.
Этот пример возьмет обе строки в качестве аргументов, удалит ?
в параметре func, и Xcode будет там, чтобы вас предупредить.
Я забыл ответить на эту часть напрямую:
Это становится нулевым, когда вы устанавливаете его на nil, что вы можете сделать, чтобы сохранить немного памяти. Просто нет смысла иметь возможность установить его на нуль и не иметь xcode, чтобы вы правильно его обрабатывали. = > Это невозможно...
var forcedUnwrappedString : String! = ""
var optionalString : String? = ""
forcedUnwrappedString = nil
optionalString = nil
func doSomethingWithString(string : String?) -> String? {
guard var unwrappedString = string else {
// error handling here
return nil
}
let tempString = unwrappedString + "!"
return tempString
}
func doSomethingUnsafeWithString(string : String) -> String {
let tempString = string
return tempString
}
var newString = doSomethingWithString(optionalString)
var newString2 = doSomethingWithString(forcedUnwrappedString)
newString = doSomethingUnsafeWithString(optionalString!) // this will crash without a warning fro xcode
newString2 = doSomethingUnsafeWithString(forcedUnwrappedString) // this will crash without a warning fro xcode
Обновление:
В текстовом свойстве UITextfield
есть наборщик, который всегда устанавливает ""
в случае nil
, не знает об этом нигде в документах или файлах UIKit.h.
var textField = UITextField(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
var string = textField.text // string = ""
textField.text = nil
string = textField.text // string = ""