Какая разница, когда переход на использование дополнительной цепочки заменяет принудительное развертывание в Swift?
Когда вызывается функция экземпляра объекта, объект может не существовать (необязательный тип), кажется, что вы всегда можете поставить вопросительный знак за именем объекта, вместо того, чтобы поставить восклицательный знак за именем объекта, а не аварийно завершить работу.
window!.rootViewController = containerViewController // forced unwrapping
// Can change to question mark and not crash.
window?.rootViewController = containerViewController // Optional chaining
Является ли это в случае принудительного развертывания в месте использования, вы всегда можете перейти к использованию необязательной цепочки, и результат будет таким же? Если да, в чем разница?
1 ответ
Разница в том, что с помощью ?
Вы заявляете, что ожидаете, что он будет иногда выполняться, когда окно равно нулю, а иногда, когда это не так. Другими словами, имея ноль window
является действительным ожиданием.
т.е. window?
говорит, что окно может или не может быть ноль. Это означает, что .rootViewController = containerViewController
может не выполняться, потому что окно равно нулю.
Это выполнит, а не вылетит ваше приложение, если window
является nil
,
С помощью !
Тем не менее, говорит ваше приложение всегда относиться window
как будто это не так nil
, Если window
не является nil
, оператор будет выполняться правильно, но если это nil
приложение будет зависать, потому что вы явно заявляете, что никогда не ожидаете, что оно будет равно нулю.
В заключение, используйте:
window!.rootViewController = containerViewController
когда вы всегда ожидаете, что окно будет действительным, чтобы установить rootViewController
и использовать:
window?.rootViewController = containerViewController
когда вы беспокоитесь о состоянии окна и о том, должен ли оператор выполняться на основе этого состояния.