【问题标题】:Swift: “unexpectedly found nil while unwrapping an Optional value” in array appendSwift:“在展开可选值时意外发现 nil”在数组追加中
【发布时间】:2016-11-22 11:14:25
【问题描述】:

尝试通过这段代码使用动画制作加载器:

        var images: [UIImage] = []
        for i in 1...10 
        {
            let strImageName : String = "loader\(i).png"
            images.append(UIImage(named: strImageName)!)
        }
        self.loader.animationImages = images
        self.loader.animationDuration = 1.0
        self.loader.startAnimating()

我收到此错误致命错误:“在展开可选值时意外发现 nil 然后我的应用程序崩溃了”以及崩溃后来自调试器的那些信息:

images = ([UImage]) 0 values  
strImageName = (String) “loader1.png”

我不明白我的代码有什么问题。 谁能帮帮我?

【问题讨论】:

标签: ios swift


【解决方案1】:

发生的情况是UIImage 的初始化程序失败,并且找不到您尝试创建的图像,因此强制展开崩溃。您必须有条件地展开(即if let):

var images: [UIImage] = []
for i in 1...10  {
    let strImageName = "loader\(i).png"
    if let image = UIImage(named: strImageName) {
        images.append(image)
    } else {
        print("Image '\(strImageName)' does not exist!")
    }
}
self.loader.animationImages = images
self.loader.animationDuration = 1.0
self.loader.startAnimating()

您也可以使用map/flatMap 在一行中完成:

let images = (1...10).map { "loader\($0).png" }.map { UIImage(named: $0) }.flatMap { $0 }

【讨论】:

  • (1...10).map 不强制转换为 Array 也可以。
【解决方案2】:

您需要使用if let 构造来安全地展开,因为 UIImage 的初始化程序是失败的。

public /*not inherited*/ init?(named name: String)

文件的名称。如果这是第一次加载图像,该方法会在应用程序的主包中查找具有指定名称的图像。

返回值 - 指定文件的图像对象,如果方法找不到指定的图像,则返回 nil。

let strImageName = "loader\(i).png"

if let image = UIImage(named: strImageName) {
    images.append(image)
}

【讨论】:

    【解决方案3】:

    Apple 的 Swift 指南: 当变量有可能在以后变为 nil 时,不应使用隐式展开的选项。如果您需要在变量的生命周期内检查 nil 值,请始终使用正常的可选类型。

    【讨论】:

    • 除了 OP 没有使用隐式展开的 Optional 之外,它们只是强制展开普通的 Optional。
    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多