В чем разница, когда изменение использования необязательной цепочки заменяет принудительную распаковку в Swift?

При вызове функции экземпляра объекта объект может быть несуществующим (необязательный тип), кажется, что вы всегда можете поставить вопросительный знак за именем объекта, вместо того, чтобы ставить восклицательный знак за именем объекта, и не сбой.

window!.rootViewController = containerViewController // forced unwrapping

// Can change to question mark and not crash. 
window?.rootViewController = containerViewController // Optional chaining

Это вместо использования принудительной развертки вы всегда можете изменить использование опциональной цепочки, и результат будет таким же? Если да, то в чем разница?


person zgjie    schedule 19.05.2015    source источник


Ответы (1)


Разница в том, что, используя ?, вы заявляете, что ожидаете, что иногда он будет выполняться, когда окно равно нулю, а иногда, когда это не так. Другими словами, наличие nil window является допустимым ожиданием.

то есть, window? говорит, что окно может быть или не быть нулевым. Это означает, что .rootViewController = containerViewController может не выполняться, потому что окно равно нулю.

Это будет выполнено и не приведет к сбою вашего приложения, если window равно nil.

Однако использование ! указывает вашему приложению всегда обрабатывать window так, как будто это не nil. Если window не равно nil, инструкция будет выполнена правильно, но если это nil, приложение вылетит, потому что вы явно заявляете, что никогда не ОЖИДАЕТЕ, что оно будет равно нулю.

В заключение используйте:

window!.rootViewController = containerViewController

когда вы всегда ожидаете, что окно будет действительным, чтобы установить rootViewController

и используйте:

window?.rootViewController = containerViewController

когда вы беспокоитесь о состоянии окна и о том, должен ли оператор выполняться на основе этого состояния.

person Chackle    schedule 19.05.2015