Какая разница, когда переход на использование дополнительной цепочки заменяет принудительное развертывание в 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

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

Другие вопросы по тегам