Swift:“在展开可选值时意外发现 nil”在数组追加中

Posted

技术标签:

【中文标题】Swift:“在展开可选值时意外发现 nil”在数组追加中【英文标题】:Swift: “unexpectedly found nil while unwrapping an Optional value” in array append 【发布时间】: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”

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

【问题讨论】:

What does "fatal error: unexpectedly found nil while unwrapping an Optional value" mean?的可能重复 UIImage(named: strImageName)! 的意思是“如果此图像不存在,请让我的应用程序崩溃”,这就是发生的情况。不要强制解包,处理错误... i.imgflip.com/utfq7.jpg 【参考方案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。

以上是关于Swift:“在展开可选值时意外发现 nil”在数组追加中的主要内容,如果未能解决你的问题,请参考以下文章

swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称

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

Swift,在展开可选值时意外发现 nil (NSKeyedUnarchiver)

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

Swift - 在展开可选值时意外发现 nil - 从委托调用变量

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