2016-11-22 54 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

相關問題