Ios 在这种情况下,如何避免可选的.None错误?

Ios 在这种情况下,如何避免可选的.None错误?,ios,uiimage,swift,Ios,Uiimage,Swift,最后一行: dataViewController.dataImage.image=UIImage(命名为:image)作为UIImage 尽管图像对象成功通过了可选绑定测试(如图所示),但仍显示“无法展开可选的.None”。图像字符串不会打印在Xcode的底部。UIImage(名称:)如果找不到具有给定名称的图像,则可能返回nil。你需要检查它是否为零 var image = self.imageData[index] as NSString if let derp =

最后一行:

dataViewController.dataImage.image=UIImage(命名为:image)作为UIImage

尽管图像对象成功通过了可选绑定测试(如图所示),但仍显示“无法展开可选的.None”。图像字符串不会打印在Xcode的底部。

UIImage(名称:)
如果找不到具有给定名称的图像,则可能返回
nil
。你需要检查它是否为零

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


可能是因为不存在具有该名称的图像而导致出现该错误。但是,您的可选绑定也存在一些问题

  • 可选绑定与强制转换不同。您没有提供新类型。此外,即使强制转换是这样做的,您也在强制转换为可选的,这并不能证明
    image
    不是零

  • 您已经向编译器声明,第一行的
    为NSString
    ,图像不是nil。如果此转换在运行时未成功,则整个应用程序将崩溃

  • 绑定可选变量后,应该使用局部变量,以后不要使用可选变量

  • 这意味着您的代码应该如下所示:

    if let img = UIImage(named: image) as UIImage! {
        dataViewController.dataImage.image = img
    }
    
    了解可选绑定过程以及与强制转换的区别后,可以将代码缩短为:

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

    注意:初始化者对nil的检查很奇怪。您必须将其强制转换为可选类型,以便可以实际测试它,因为Objective-C中的初始值设定项实际返回。

    为什么要将
    img
    设为隐式展开的可选类型?特别是在第二种情况下,您可以将其设置为非可选,因为您使用的是可选绑定。@drewag为什么不呢?对于第二种情况,我不是100%确定drop optional它会起作用,我现在无法测试它。在第一种情况下,如果某个值确实为零,那么您应该始终使用实际的optional,然后编译器强制您将其展开。在第二种情况下,隐式展开的可选项实际上什么也不做。最好的情况是,它只是更详细。虽然我只是自己测试了一下,但你们不能把初始值设定项当作是可选的,所以这两个版本都不会编译。第一种情况你们是对的。但对于第二种情况,你错了。构造函数通过defaultYup返回非可选值是一种解决方法。你说得对,我没有意识到有一种方法可以测试初始值设定项是否为nil,谢谢。对于最后一个示例,我得到一个错误:“条件中的绑定值必须是可选类型的”。@user3784622 ya,我刚刚测试过。我忘了你不能把初始值设定项视为可选的。我更新了我的答案。天哪,我发现这个选项让人困惑!你是如何花时间去理解它们的?swift手册是目前最好的选择吗?谢谢。如果从
    UIImage(名为:imageName)
    返回在展开
    UIImage
    时导致的错误,则您的代码将无法工作。检查@user3784622对我来说,这是阅读swift手册和潜伏在堆栈溢出上的组合;)可能重复的
    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")
    }