A window is an instance of the UIWindow
class and it is the topmost element of any application UI’s hierarchy. It doesn’t draw any visual object and can be considered as a blank container for the UI elements called views. An application must have at least one window that normally fills the entire screen.
One of the main roles of the window is to deliver touches to the underlying views. A window is the first entry point for a touch event. The touch is then pushed down through the view hierarchy until it reaches the right view.
The contents of your application are mainly directed by view controllers and presented through views, which are displayed inside a window. The easiest and most reliable way to send content to a window is by configuring its rootViewController
property with a UIViewController
instance. The view controller’s view
will automatically be set as the contents of the window and presented to the user.
The view controller is initialised and set as the root view controller of the window. Finally, the window presents the current root view controller’s view.

Configuring windows
When you create a new Xcode project using the wizard, a Storyboard is created for you. If you check the Info.plist
file, you’ll see that the Main storyboard filebase name
key reports the name of the Storyboard by default as Main
.
This key tells Xcode that you want to start the application from the Storyboard initial view controller (the one indicated by the grey arrow inside the Storyboard working area).
The @UIApplication
attribute in the AppDelegate.swift
file is responsible for the launch of the entire application process. It marks an entry point for the application launch, reading the Storyboard’s information from the Info.plist
file and instantiating the initial view controller.
At this point, a UIWindow
instance is created and associated with the window
property of the AppDelegate
class. The initial view controller, previously initialised, is now assigned to the rootViewController
property of the window; therefore, the initial view controller’s view
becomes the current window’s contents.
Since windows are invisible by default, there is one last step required to show the content to the user. After the application:didFinishLaunchingWithOptions
function finishes its execution, makeKeyAndVisible
is called for the window, which now loads its interface from rootViewController
and finally displays its contents.

The same results can be obtained programmatically.
If you remove the Main storyboard filebase name
key from the Info.plist
file, Xcode won’t have any information on how to set up a valid window. The application:didFinishLaunchingWithOptions
is the place to do it.
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool
{
// Instantiate a window with the same size as a screen
window = UIWindow(frame: UIScreen.main.bounds)
// Instantiate a view controller with the Main storyboard
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard
.instantiateViewController(withIdentifier: "ViewController")
as! ViewController
window?.rootViewController = viewController
window?.makeKeyAndVisible()
return true
}