When call a function of an object instance, the object may be not exist(optional type), it seems like you can always put an question mark behind the object name, instead of p
The difference is that by using ?
you're stating you expect it to sometimes execute when window is nil and sometimes when it is not. In other words, having a nil window
is a valid expectation.
ie, window?
says that the window may or may not be nil. This means that .rootViewController = containerViewController
may not execute because window is nil.
This will execute and not crash your app if window
is nil
.
Using !
however tells your application to always treat window
as if it is not nil
. If window
is not nil
, the statement will execute correctly, but if it is nil
the app will crash because you're explicitly stating that you never EXPECT it to be nil.
To conclude, use:
window!.rootViewController = containerViewController
when you always expect the window to be valid in order to set your rootViewController
and use:
window?.rootViewController = containerViewController
when you are concerned about the state of window and whether or not a statement should execute based on that state.