В чем разница между "?" а также "!" в Свифт?
Я знаю, что? "а также"!" когда я объявляю переменные в Swift. Но что они означают при использовании этих переменных? Например, в этом коде:
var attachment: NSTextAttachment = NSTextAttachment()
attachment.image = UIImage(named: "placeholder.png")
attachment.image!.size ... // or attachment.image?.size ...
Какая разница между attachment.image!.size
и attachment.image?.size
?
Ответы
Ответ 1
Используйте attachment.image!.size
, если вам гарантировано, что image?
не nil
. Если вы ошибаетесь (и это nil
), ваше приложение выйдет из строя. Это называется принудительной разворачиванием.
Если вы не уверены, что это не будет nil
, используйте image?
.
В вашем случае image!
в порядке, так как вы контролируете существование placeholder.png
.
Прочитайте всю документацию по Swift Optionals. Это основная и фундаментальная часть языка.
Ответ 2
что есть! и?:
- Использовать? если значение может стать нулевым в будущем, так что вы проверите для
это.
- Используйте! если это действительно не должно стать нулевым в будущем,
но сначала он должен быть ноль.
если вы используете attachment.image!.size
любую переменную с! означает, что компилятор не беспокоится об этой переменной, имеет любое значение или nil
.
он идет дальше, и здесь он попытается получить размер изображения. if attachment.image
is nil
, тогда приложение будет аварийно завершено.
Пока attachment.image?.size
, вы убедитесь, что если attachment.image
не равно nil, тогда будет выполнено другое действие, иначе оно подтвердит, что приложение не будет аварийно завершено в случае nil
значения image
.
Резюме:
Нам нужно использовать!, когда мы убеждаемся, что переменная типа параметра имеет значение за раз, и нам нужно предпринять дальнейшие действия, иначе.
Ответ 3
Когда вы используете !
, а переменная nil
, это вызовет ошибку времени выполнения, но если вы используете ?
, она будет изящно изнашиваться.
Более подробная информация в яблочный документ
Ответ 4
Оба символа! а также? используется для опций. Мы должны использовать!, Когда мы убедимся, что переменная типа параметра имеет значение за раз, и нам нужно принять меры к нему. В противном случае произойдет сбой, если значение переменной равно nil. И если вы используете?, Приложение не будет аварийно завершено в без дела.
Вы можете перейти по этой ссылке для получения дополнительной информации: - https://www.youtube.com/watch?v=twBfiKsbHP8