无法强制解开非可选类型“UIImage”的值

Posted

技术标签:

【中文标题】无法强制解开非可选类型“UIImage”的值【英文标题】:Cannot force unwrap value of non-optional type 'UIImage' 【发布时间】:2016-04-13 07:03:23 【问题描述】:

在我的项目中包含以下代码行。但我总是得到错误。我正在使用 Xcode 7.2 和 ios 9。

let image: UIImage = UIImage(CGImage:imageRef, scale:originalImage.scale, orientation:originalImage.imageOrientation)!

【问题讨论】:

去掉感叹号... 【参考方案1】:

删除!

该方法的结果不是可选的 - 你不需要解开它。

NB 你不需要变量中的: UIImage - Swift 会为你推断它的类型。


编辑:如果imageRef 是可选的(来自@chewie 的评论)怎么办?

您有几个选择。

1 使用if let

if let imageRef = imageRef 
   let image = UIImage(CGImage: imageRef, scale: originalImage.scale, orientation: originalImage.imageOrientation)

    // Do something with image here

2 使用guard

guard let imageRef = imageRef else 
    print("Oops, no imageRef - aborting")
    return


// Do something with image here
let image = UIImage(CGImage: imageRef, scale: originalImage.scale, orientation: originalImage.imageOrientation)

3 使用地图

let image = imageRef.map 
    UIImage(CGImage: $0, scale: originalImage.scale, orientation: originalImage.imageOrientation)


// Do something with image here, remembering that it's 
// optional this time :)

使用哪个是您的选择,但这是我的经验法则。

如果您需要执行的操作需要一张图片,请使用guard,如果您没有图片,请提前中止。这通常会使您的代码更易于阅读和理解。

如果您需要做的事情可以在没有图像的情况下完成,请使用if letmapif let 如果您只想做某事然后继续,这很有用。如果您需要传递您的 UIImage? 并在以后使用它,map 非常有用。

【讨论】:

如果我这样做,Xcode 会抱怨可选类型“CGImage?”没有展开。 啊 - 你有一个稍微不同的问题 - 我认为你的 imageRef 是可选的。我已经编辑了我的答案,希望对您有所帮助。

以上是关于无法强制解开非可选类型“UIImage”的值的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能强制解开我的 $string 以用作 TextField 值?

如何使用警卫同时解开 Swift 可选和强制类型转换?

可选类中的可选属性 VS 可选字典中的可选值

Swift:在运行时在非可选中检测到意外的 nil 值:强制转换为可选失败

可选类型“UIImage?”的值未打开

Xcode 在非可选的字符串上返回 nil