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的底部。
答案 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)
您可能会收到该错误,因为该名称的图片不存在。但是,您的可选绑定也存在一些问题。
可选绑定与转换不同。你没有提供新的类型。此外,即使铸造是这样做的方式,你也会选择一个可选的,这并不能证明image
不是零。
您已经向编译器断言第一行上的as NSString
图片不是nil。如果此转换在运行时未成功,则整个应用程序将崩溃。
绑定一个可选项后,你应该使用局部变量,而不是以后再使用
这意味着您的代码应如下所示:
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。