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