我的目的是从现有图像中分配UIView的颜色:
self.myView.backgroundColor = UIColor(patternImage: UIImage(named: "04_white_back_page2")?)
据我了解,我不知道这个UIImage(名为:" 04_white_back_page2")是否包含nil或值,所以:如果有值,请使用它,否则只考虑整个表达式为nil什么都不做。
为什么我总是收到错误:
"可选类型的值' UIImage'没有打开;你的意思是使用'!'或'?'"
答案 0 :(得分:2)
简答: 将代码更改为
self.myView.backgroundColor = UIColor(patternImage: UIImage(named: "04_white_back_page2")!)
答案很长
首先,UIImage(named:)
是一个可用的初始化程序'
如果项目资源中不存在您的文件名04_white_back_page2
,则初始值设定项UIImage(named: "04_white_back_page2")
将失败并变为nil
。
由于UIColor(patternImage:)
仅接受UIImage
,因此swift编译器抱怨您的UIImage(named: "04_white_back_page2")
类型为UIImage?
。
您可以在(https://developer.apple.com/swift/blog/?id=17)
上查看有关可用初始值设定项的详细说明但是,您知道04_white_back_page2
是否在您的项目中(对吗?)。因此,安全地解开'你的表达!
。使用!
表示编译器您非常确信表达式不是nil
。然后UIImage(named: "04_white_back_page2")!
的类型为UIImage
,编译器很满意。如果信任错误,您的应用程序将在运行时死于消息fatal error: unexpectedly found nil while unwrapping an Optional value
。
因此,只有在您有信心时才使用!
。
一般情况下,您不知道您的表达是nil
。在这种情况下,您应该以这种方式处理这两种情况。
if let img = UIImage(named: "04_white_back_page2") {
self.myView.backgroundColor = UIColor(patternImage: img)
}
答案 1 :(得分:1)
您正在使用的UIColor
的init方法(patternImage
)不期望可选但实际值(因此不允许使用nill值)
所以要么强行打开'!'
self.myView.backgroundColor = UIColor(patternImage: UIImage(named: "04_white_back_page2")!)
或在创建颜色之前确保图像存在。
前者不安全,因为如果图像因任何原因无法加载会导致运行时错误,因此我建议您使用第二个选项
答案 2 :(得分:1)
如果你不知道你的图像是否存在,你应该使用可选绑定,试试这个:
func setBGImage(myImageName: String) {
if let bgColor = UIImage(named: myImageName) {
self.view.backgroundColor = UIColor(patternImage: bgColor)
}
}
如果 myImage 存在,它会将其分配给 bgColor ,其中分配给 self.view.backgroundColor
或者,如前所述,如果你知道图像存在,只需强行解开它:
self.myView.backgroundColor = UIColor(patternImage: UIImage(named: "04_white_back_page2")!)
祝你好运!
答案 3 :(得分:0)
所以:如果它有价值使用它,否则只考虑整体 表达无,无所事事
您正在描述可选链接。在可选链中,如果变量或表达式可能是nil
,则?
后跟它允许您打开它以访问成员,方法或数组访问或字典查找。如果变量或表达式为nil
,则整个表达式为nil
。
可选链接仅在?
后跟成员名称(属性),方法调用或数组/字典访问[]
时才有效。它不会以?
结尾。此外,可选链的结果始终是一个可选值,因此无论如何它都无法帮助您,因为UIColor
的构造函数不是可选的。遗憾的是,您无法以您尝试的方式使用可选链接。如果你的UIImage
为nil
只是跳过了整行,那就太好了,但它不会那样工作。
如果您不确定图像是否存在,处理此问题的正确方法是在创建图像时使用可选绑定:
if let image = UIImage(named: "04_white_back_page2") {
self.myView.backgroundColor = UIColor(patternImage: image)
}