2016-11-22 52 views
0

尝试使用动画低谷这个代码,以使装载机:斯威夫特:“意外发现零而展开的可选值”的阵列追加

 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() 

我得到这个错误致命错误:“意外发现零而展开的可选值 然后,我的应用程序崩溃”,并从调试器崩溃后的信息:

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

我不明白什么是错在我的代码。 任何人都可以帮助我吗?

+2

可能重复[什么是“致命错误:意外地发现零,而解包可选值”是什么意思?](http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found- nil-while-unwrapping-an-optional-valu) – Idan

+7

'UIImage(named:strImageName)!'的意思是“如果这个图像不存在,请崩溃我的应用程序”,这就是发生了什么事。不要强制拆包,处理错误... – Moritz

+0

https://i.imgflip.com/utfq7.jpg – fpg1503

回答

2

发生了什么事是UIImage的初始化是failable和你想创建图像无法找到这样迫使展开崩溃。你必须有条件地解开(即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

'(1 ... 10).map'没有转换成'Array'也会起作用。 – user28434

1

您需要使用if let构造才能安全地展开,因为UIImage的构造器是failable的。

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

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

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

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

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

苹果斯威夫特指南: 隐展开自选不宜使用当有可能在稍后变量变为零时。如果您需要在变量的生命周期中检查零值,则始终使用正常的可选类型。

+1

除OP没有使用隐式解包可选外,它们只是强制解包正常可选。 – Moritz

相关问题