2014-09-17 3 views
13

Я знаю, что "?" а также "!" когда я объявляю переменные в Swift. Но что они означают, когда с использованием этих переменных? Например, в этом коде:В чем разница между "?" а также "!" в Свифт?

var attachment: NSTextAttachment = NSTextAttachment() 
attachment.image = UIImage(named: "placeholder.png") 
attachment.image!.size ... // or attachment.image?.size ... 

В чем разница между attachment.image!.size и attachment.image?.size?

ответ

30

Используйте attachment.image!.size, если вам гарантировано, что image? не nil. Если вы ошибаетесь (и это nil), ваше приложение выйдет из строя. Это называется принудительной разворачивания.

Если вы не уверены не будет nil, используйте image?.

В вашем случае image! в порядке, так как вы контролируете, существует ли placeholder.png.

Прочитать всю документацию по адресу Swift Optionals. Это основная и фундаментальная часть языка.

+0

Благодарим вас за разъяснения. – Raja

17

что есть! и?:

  • Использование? если значение может стать нулевым в будущем, так что вы проверите это для .
  • Использование! если он действительно не станет нулевым в будущем, , но сначала он должен быть нолем.

если вы используете attachment.image!.size любую переменную с! означает, что компилятор не беспокоится об этой переменной, имеет любое значение или nil. Он идет дальше, он попытается получить размер изображения. если attachment.image - nil, тогда приложение будет аварийно завершено.

Хотя attachment.image?.size, это будет убедиться, что вы, если attachment.image не ноль, то дальнейшее действие будет происходить, в противном случае Но подтвердить применение не будет авария в случае nil стоимости image.

Резюме:

Мы должны использовать, когда мы уверены, что тип переменной параметр имеет значение в то время, и мы должны принять решение по нему дальше, в противном случае.

1

Если вы используете !, а переменная nil, это вызовет ошибку времени выполнения, но если вы используете ?, это будет неудачно изящно. Более подробная информация в apple document