swift上的UIImage无法检查nil

Posted

技术标签:

【中文标题】swift上的UIImage无法检查nil【英文标题】:UIImage on swift can't check for nil 【发布时间】:2014-08-19 23:23:19 【问题描述】:

我在 Swift 上有以下代码

var image = UIImage(contentsOfFile: filePath)
        if image != nil 
           return image
       

它曾经运行良好,但现在在 Xcode Beta 6 上,这会返回一个警告

 'UIImage' is not a subtype of 'NSString'

我不知道该怎么做,我尝试了不同的方法,例如

 if let image = UIImage(contentsOfFile: filePath) 
            return image
   

但错误变为:

Bound value in a conditional binding must be of Optional type

这是 Xcode6 beta 6 的错误还是我做错了什么?

【问题讨论】:

我认为您需要手动定义类型:var image:UIImage! = ...。将尝试追查源头。 我遇到了类似的问题,但解决方案是清理构建文件夹(⌘⇪K)。如果你有同样的问题,你应该试试。 我在 Obj-C 中有类似的东西。您可以尝试将 image != nil 替换为 [image isNotEqualTo:nil] 或它的 Swift 版本。 【参考方案1】:

更新

Swift 现在添加了可失败初始化器的概念,而 UIImage 现在就是其中之一。初始化器返回一个 Optional,因此如果无法创建图像,它将返回 nil。


默认变量不能为nil。这就是为什么在尝试将 imagenil 进行比较时出现错误的原因。您需要将变量显式定义为optional:

let image: UIImage? = UIImage(contentsOfFile: filePath)
if image != nil 
   return image!

【讨论】:

不应该是“UIImage”吗?使用 UIImage(contentsOfFile: filePath) 时可以推断,因为它可以返回 nil? "一个已初始化的 UIImage 对象,如果方法找不到文件或从其内容初始化图像,则为 nil。" 另外,为什么我的第二次尝试没有成功? afaik,如果 let x = y 应该可以正常工作。 这似乎是 Xcode beta 6 上的一个错误,如更改日志中所见:“如果您遇到返回值被错误地视为不可为空的方法,或被错误地视为属性的方法不可为空,您可以通过立即将结果包装在可选中来解决该问题:! ! var fooOpt: NSFoo? = object.reallyMightReturnNil() if let foo = fooOpt ... " @Wak,这自第一个测试版以来就已经存在,并不是他们在更改说明中所指的内容。他们很清楚这一点。问题是 Swift 对象从来没有可选的构造。从可以从初始化返回 nil 的 Objective-C 不能很好地转换。我的解决方案是当前的解决方法。他们将来可能会想出更优雅的方法来解决问题。 “failable”,而不是“bailable”(虽然“bailable”确实有一定的意义!)【参考方案2】:

检查图像是否有内容(> nil)的最简单方法是:

    if image.size.width != 0  do someting 

【讨论】:

【参考方案3】:
func imageIsNullOrNot(imageName : UIImage)-> Bool


   let size = CGSize(width: 0, height: 0)
   if (imageName.size.width == size.width)
    
        return false
    
    else
    
        return true
    

上面的方法调用 Like as :

 if (imageIsNullOrNot(selectedImage))
 
     //image is not null
 
 else
 
    //image is null
 

在这里,我检查图像大小。

【讨论】:

【参考方案4】:

初始化,你调用init?(contentsOfFile path: String) ? 意味着它返回可选值。

您应该在使用之前检查nil 的可选变量。

比公认的答案和 Swift 风格 方式更短,比命名为 Optional Chaining 的方式更短:

if let image = UIImage(contentsOfFile: filePath) 
   return image

【讨论】:

【参考方案5】:

你可以像这样检查它的 imageAsset:

if image.imageAsset != nil

    // image is not null

else 

    //image is null

【讨论】:

【参考方案6】:

您可以检查它的宽度,如果没有上传图片,则为0。

if(image.size.width != 0)

      print("image found")

 else 

      print("image is null")


【讨论】:

以上是关于swift上的UIImage无法检查nil的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中从UIImage获取图像扩展/格式

无法在 Swift 中使用时间延迟为 UIImage 设置动画

Swift:创建 UIImage 数组

检查 UIImage 是不是为横向图像

无法在iOS swift中将base64string解码为uiimage,但在android中工作正常[重复]

如何使用 Swift 获取 UIImage 中像素的颜色?