如何在此方案中避免Optional.None错误?

时间:2014-07-03 02:30:08

标签: ios uiimage swift

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

最后一行:

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的底部。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

您可能会收到该错误,因为该名称的图片不存在。但是,您的可选绑定也存在一些问题。

  1. 可选绑定与转换不同。你没有提供新的类型。此外,即使铸造是这样做的方式,你也会选择一个可选的,这并不能证明image不是零。

  2. 您已经向编译器断言第一行上的as NSString图片不是nil。如果此转换在运行时未成功,则整个应用程序将崩溃。

  3. 绑定一个可选项后,你应该使用局部变量,而不是以后再使用

  4. 这意味着您的代码应如下所示:

    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")
    }
    

    注意:从初始化程序检查nil很奇怪。你必须将它转换为可选类型,以便你可以实际测试它,因为Objective-C的初始化器实际上返回Implicitly Unwrapped Optionals