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

Posted

技术标签:

【中文标题】为啥使用?在这种情况下不工作? (迅速)【英文标题】:Why using ? in this case is not working? (swift)为什么使用?在这种情况下不工作? (迅速) 【发布时间】:2015-06-23 10:15:39 【问题描述】:

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

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

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

为什么总是报错:

"可选类型 'UIImage' 的值未解包;您的意思是使用 '!'还是'?'”

【问题讨论】:

【参考方案1】:

简答: 把代码改成

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)

【讨论】:

【参考方案2】:

如果你不知道你的图片是否存在,你应该使用可选绑定,试试这个:

func setBGImage(myImageName: String) 
  if let bgColor = UIImage(named: myImageName) 
    self.view.backgroundColor = UIColor(patternImage: bgColor)
  

如果myImage存在,则将其分配给bgColor,其中分配给self.view.backgroundColor em>。

或者,如前所述,如果您知道图像存在,只需强制解开它

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

祝你好运!

【讨论】:

实际上您可能希望在这两个部分都使用可选绑定,因此请使用一对链接的可选绑定语句。 @DuncanC, UIColor(patternImage:) 不会失败。它返回 UIColor 而不是 UIColor?【参考方案3】:

您正在使用的 UIColor 的 init 方法 (patternImage) 不需要一个可选值,而是一个实际值(因此不允许使用 nill 值)

所以要么用 '!' 强制解包

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

或在创建颜色之前确保图像存在。

前者不安全,如果由于某种原因无法加载图像,则会导致运行时错误,因此我建议您使用第二个选项

【讨论】:

但是,我不知道图像是否存在。这种情况的简洁表达方式是什么? 图片是您的应用资源的一部分,还是您从外部来源读取的?无论哪种方式,如果您希望有时此图像不可用,请考虑使用默认颜色(或默认图像) 我的意思是一般情况下。 Swift 语言并不像我想象的那样完美。这仍然取决于开发人员一开始就知道什么。【参考方案4】:

so:如果它有价值,就使用它,否则只考虑整体 表达式为零,什么也不做

您正在描述可选链接。在可选链中,如果变量或表达式可能是nil,则在其后跟? 允许您为了访问成员、方法或数组访问或字典而将其解包抬头。如果变量或表达式为nil,则整个表达式为nil

可选链接仅在 ? 后跟成员名称(属性)、方法调用或数组/字典访问 [] 时才有效。仅以? 结尾没有任何作用。此外,可选链 的结果始终是可选值,因此无论如何它对您没有帮助,因为UIColor 的构造函数不接受可选值。不幸的是,您不能以您尝试的方式使用可选链接。如果你的UIImagenil,它会跳过整行,但它不会那样工作。

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

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

【讨论】:

以上是关于为啥使用?在这种情况下不工作? (迅速)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DISTINCT 在这种情况下不起作用? (SQL)

为啥我的 JRadioButton 在这种情况下不起作用?

为啥这个 if 语句在这种情况下不起作用? [关闭]

为啥 os.path.join() 在这种情况下不起作用?

jquery/livequery 在这种特殊情况下不起作用

为啥转换在我的情况下不起作用