为何使用?在这种情况下不工作? (迅速)

时间:2015-06-23 10:15:40

标签: ios swift

我的目的是从现有图像中分配UIView的颜色:


self.myView.backgroundColor = UIColor(patternImage: UIImage(named: "04_white_back_page2")?)

据我了解,我不知道这个UIImage(名为:" 04_white_back_page2")是否包含nil或值,所以:如果有值,请使用它,否则只考虑整个表达式为nil什么都不做。

为什么我总是收到错误:

"可选类型的值' UIImage'没有打开;你的意思是使用'!'或'?'"

4 个答案:

答案 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的构造函数不是可选的。遗憾的是,您无法以您尝试的方式使用可选链接。如果你的UIImagenil只是跳过了整行,那就太好了,但它不会那样工作。

如果您不确定图像是否存在,处理此问题的正确方法是在创建图像时使用可选绑定

if let image = UIImage(named: "04_white_back_page2") {
    self.myView.backgroundColor = UIColor(patternImage: image)
}