为什么在UIApplicationDelegate中使window属性可选而不是隐式解包可选?

时间:2016-11-07 07:20:19

标签: ios swift optional uiwindow

为什么var window: UIWindow?不是UIWindow!,也就是为什么让窗口可选,是不是每个应用都应该有一个主UIWindow(没有它应用程序根本无法运行)?!

我看到this answer说它确实从UIWindow!更改为UIWindow?所以它必须有理由。我只是想不通为什么。此外,使用UIWindow?,主窗口的类型变为双重可选,它实在很尴尬。

2 个答案:

答案 0 :(得分:1)

这是因为将UIMainStoryboardFile密钥添加到应用程序的.plist文件(默认添加)是实例化窗口的原因。

enter image description here

window rootViewController将包含故事板的初始视图控制器,它将在屏幕上显示。

测试一下!

我们可以让window无效吗?

尝试从项目的.plist文件中删除UIMainStoryboardFile行,并尝试在window方法中记录application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // if your removed 'UIMainStoryboardFile' key from the plist, this should prints nil
    print(window)

    return true
}

答案 1 :(得分:1)

我向苹果工程师提出了这个问题,以下是他的回答,

"一个示例是任何分配给故事板中某个对象的自定义类的初始化函数。初始化函数在调用该类上的任何其他方法之前运行(包括-initWithCoder:,在故事板加载期间调用它)。它们将在加载故事板时运行,但在创建窗口对象并将其分配给应用程序委托之前。初始化函数可以获取对应用程序委托的引用并尝试读取其窗口。"