为啥使用?在这种情况下不工作? (迅速)
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
的构造函数不接受可选值。不幸的是,您不能以您尝试的方式使用可选链接。如果你的UIImage
是nil
,它会跳过整行,但它不会那样工作。
如果您不确定图像是否存在,处理此问题的正确方法是在创建图像时使用可选绑定:
if let image = UIImage(named: "04_white_back_page2")
self.myView.backgroundColor = UIColor(patternImage: image)
【讨论】:
以上是关于为啥使用?在这种情况下不工作? (迅速)的主要内容,如果未能解决你的问题,请参考以下文章