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