【问题标题】:Swift / Xcode - Unwrapping an Optional valueSwift / Xcode - 解开可选值
【发布时间】:2020-02-04 20:14:14
【问题描述】:

当我尝试使用“!”解开“var window”时它显示 Optional 值为 nil。

致命错误:在展开可选值时意外发现 nil

var window: UIWindow?

// image to be animated
let backgroundImg = UIImageView()


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    // creating imageView to store background image "mainbg.jpg"
    backgroundImg.frame = CGRect(x: 0, y: 0, width: 1000, height: 1000)
    backgroundImg.image = UIImage(named: "mainbg.jpg")
    self.window!.addSubview(backgroundImg)

    return true
}

有其他人遇到过这个问题并设法解决了吗?

我正在使用带有 SWIFT 5 的 XCODE 版本 11.3.1。这个

【问题讨论】:

标签: swift xcode appdelegate swift5 uiwindow


【解决方案1】:

您必须了解什么是 Optional 类型。可选类型基本上意味着变量可以为 nil 。

如果变量是可选的,要从变量中获取值,您必须解包它。这只是意味着在末尾加上一个感叹号。

【讨论】:

  • 感谢您的回复。我尝试使用“!”强制展开。但如下所述,var 窗口为 nil。
【解决方案2】:

正如 cmets 中已经提到的,您的 UIWindow 可选变量尚未分配,因此默认情况下仍为 nil。您可能需要一个不同的项目模板来为您设置窗口。

至于“!”运算符,通常你应该尽量避免使用它,因为如果你的可选项未赋值或为零,它总是会抛出异常。阅读Optionals in the Swift Manual

【讨论】:

    【解决方案3】:

    问题是当您尝试将backgroundImg 添加为子视图时,window 上的强制展开。在您共享的代码中,您在使用之前没有设置窗口值,所以有nil

    要修复它,您必须在添加子视图之前创建一个新窗口实例。

    window = UIWindow()
    self.window!.addSubview(backgroundImg)
    

    【讨论】:

    • 之前应该如何创建窗口实例?我正在做一个 Udemy 课程,它使用完全相同的代码,但使用的是旧版本的 XCode 和 Swift,但在那种情况下,只声明“window = UIWindow()”就足以没有错误:“致命错误:在展开可选值时意外发现 nil"
    • 是的,在application(_:didFinishLaunchingWithOptions:)中,在添加子视图之前你必须创建UIWindow实例,window = UIWindow()-
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多