2014-07-03 107 views
0
var image = self.imageData[index] as NSString  
     if let derp = image as NSString? { 
      println(" \(image)") 
     } else { 
      println("is nil") 
     } 

     dataViewController.dataImage.image = UIImage(named: image) as UIImage 

最後一行:如何避免在這種情況下的Optional.None錯誤?

dataViewController.dataImage.image = UIImage(named: image) as UIImage

給我「不能拆開包裝Optional.None」,儘管圖像對象成功通過可選的結合試驗如下所示https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_428。圖像字符串確實打印在Xcode的底部。

+0

的可能重複【如何正確檢查,如果無可選的返回值是否有效?(http://stackoverflow.com/questions/24439773/how-to-properly-check-if-non-optional-return-值是有效的) –

回答

1

這是可能的,因爲該名稱的圖像不存在你所得到的錯誤。但是,您的可選綁定也存在一些問題。

  1. 可選綁定與鑄造不同。你不提供新的類型。另外,即使演員也是這樣做的,你可以選擇演出,但這並不能證明image不是零。

  2. 您已經斷言編譯器對圖像不比零您as NSString在第一行。如果此轉換在運行時不成功,您的整個應用程序將崩潰。

  3. 結合可選的之後,你應該使用局部變量,而不是使用可選的後

這意味着你的代碼應該是這樣的:

var possibleImageName = self.imageData[index] as? NSString  
if let imageName = possibleImageName { 
    var possibleImage : UIImage? = UIImage(named: imageName) 
    if let image = possibleImage { 
     dataViewController.dataImage.image = image 
    } 
} else { 
    println("is nil") 
} 

在瞭解可選綁定過程和與鑄造的區別,可以縮短代碼到這個:

if let imageName = self.imageData[index] as? NSString { 
    if let image = UIImage(named: imageName) as UIImage? { 
     dataViewController.dataImage.image = image 
    } 
} else { 
    println("is nil") 
} 

注:從初始化爲零的支票是奇怪。您必須將其轉換爲可選類型,以便您可以對其進行實際測試,因爲Objective-C的初始化程序實際上會返回Implicitly Unwrapped Optionals

+0

我得到一個錯誤:「最後一個例子中,」條件中的綁定值必須是可選類型「。 – user3784622

+0

@ user3784622你好,我剛剛測試過。我忘了你不能把初始值設定爲可選項。我更新了我的答案。 – drewag

+0

善良,我發現這個選項的東西混亂!你是如何花時間理解它們的?快速手冊是目前最好的選擇嗎?謝謝。 – user3784622

1

UIImage(named:)可能的情況下,返回nil與給定名稱的圖像不能被發現。你需要檢查它不是零。

var img : UIImage? = UIImage(named: image) 
if img != nil { 
    dataViewController.dataImage.image = img! 
} 

if let img = UIImage(named: image) as UIImage! { 
    dataViewController.dataImage.image = img 
} 
+0

爲什麼使'img'隱式解包可選?特別是在第二種情況下,您可以使其成爲非可選項,因爲您正在使用可選綁定。 – drewag

+0

@drewag爲什麼不呢?對於第二種情況,我不是100%肯定的下降可選它將工作,我現在不能測試它。 –

+0

在第一種情況下,如果某件事真的可以爲零,那麼你應該總是使用一個實際的可選項,然後編譯器迫使你解開它。在第二種情況下,隱式解包的可選方法幾乎毫無用處。最好的例子,它只是更詳細。雖然我只是自己測試一下,你不能將初始化器看作是可選的,所以這兩個版本都不會編譯。 – drewag

相關問題