ios - 将 UIWindow 声明为 let 而不是可选的 var 可以很好地编译。有什么陷阱吗?

标签 ios swift uiwindow

我见过很多 UIWindow 被声明为 Optional 变量的例子,就像这样,

var 窗口:UIWindow?

我的应用程序只有一个窗口,并且在整个生命周期内都保持不变。我认为将其声明为常量更有意义。 所以我做到了。它不会引发任何编译器错误(从 iOS 8.2 开始)并且似乎工作正常。

为什么没有其他人这样做?这样做有什么陷阱吗?

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    let window: UIWindow = UIWindow(frame: UIScreen.mainScreen().bounds)

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        let viewController = ViewController()

        window.rootViewController = viewController
        window.makeKeyAndVisible()

        return true
     }

最佳答案

您的问题分为两部分:letvar,可选与非可选。

对于第一部分,将对象属性声明为 let 仅意味着您希望该属性在其整个生命周期中引用同一对象。在单窗口应用程序的 AppDelegate 中有意义。

对于第二部分,UIWindowUIView 继承了它的初始化器; documentation for UIView说初始化器可以返回 nil,尽管 Swift 版本没有声明为可失败的。

因此,如果您在其他上下文中处理 UIView,则将变量声明为可选的或至少未包装的变量并能够处理结果可能是有意义的。

就是说,当您的程序启动时,如果 UIWindow 无法初始化,立即崩溃可能是合理的做法,因为您实际上无法做任何其他事情。 :)

我看不出您的做法有任何问题,但我也愿意听取其他人的意见。

关于ios - 将 UIWindow 声明为 let 而不是可选的 var 可以很好地编译。有什么陷阱吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27362953/

相关文章:

ios - SwipeCellKit 滑动删除未调用

ios - PhoneGap iOS 中的扩展启动画面

ios - 来自单个 UIButton 的多个 Segue,该 UIButton 由于 ImageView 而发生变化

iphone - 添加到 ALAssetGroup 时 ALAsset 的自定义文件名

ios - 无法加密和解密plist中的数据

iOS api 调用本地 RESTful Django 失败

swift - Arkit - 3d 模型真实尺寸快速

ios - UIWindow 不显示 iOS 13 中的内容

ios - "Application windows are expected..."警告,但应用运行正常

iphone - 如何删除 UIWindow?