Swift中的UIImage无法检查nil值。

41

我有以下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的一个bug吗?还是我做错了什么?


我认为你需要手动定义类型:var image:UIImage! = ...。我会尝试找到源代码。 - Brian Nickel
我遇到了类似的问题,但解决方法是清理构建文件夹(⌘⇪K)。如果你也遇到了同样的问题,可以尝试一下这个方法。 - Oxcug
我在 Obj-C 中遇到过类似的情况。你可以尝试用 [image isNotEqualTo:nil] 或其 Swift 版本替换 image != nil - WorkingMatt
6个回答

57

更新

Swift现在增加了可失败初始化器的概念,UIImage现在成为其中之一。这个初始化器返回一个Optional,所以如果图像无法创建,它将返回nil。


默认情况下,变量不能为nil。这就是为什么尝试将imagenil进行比较时会出现错误的原因。您需要显式地将变量定义为可选项

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

当使用UIImage(contentsOfFile: filePath)时,由于它可以返回nil,因此"UIImage?"不应该被推断吗?它会返回已初始化的UIImage对象,或者如果该方法无法找到文件或从其内容初始化图像,则返回nil。 - Wak
另外,为什么我的第二次尝试没有成功?据我所知,如果 let x = y {} 应该可以正常工作。 - Wak
在Xcode beta 6上似乎存在一个错误,如更改日志所示:“如果您遇到一个方法,其返回值被错误地认为是非空的,或者一个属性被错误地认为是非空的,您可以通过立即将结果包装在可选项中来解决问题:! ! var fooOpt: NSFoo? = object.reallyMightReturnNil() if let foo = fooOpt { ... }” - Wak
@Wak,这个问题从第一个测试版就存在了,并且不是他们在更改说明中所指的。他们非常清楚这一点。问题在于Swift对象从来没有可选构造函数。这在Objective-C中可以从初始化返回nil,但翻译到Swift中就不太好处理了。我的解决方案是当前的解决方法。他们可能会在未来想出更优雅的解决方法来解决这个问题。 - drewag
1
"failable",而不是“bailable”(尽管“bailable”确实有一定的意义!) - matt

11

检查图像是否具有内容(> 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
    }
}

上述方法的调用方式如下:
 if (imageIsNullOrNot(selectedImage))
 {
     //image is not null
 }
 else
 {
    //image is null
 }

这里,我检查图片的大小。


2
您可以检查其宽度,如果没有上传图片,则宽度为0。
if(image.size.width != 0){

      print("image found")

} else {

      print("image is null")

}

1

初始化,您需要调用init?(contentsOfFile path: String),其中?表示它返回一个可选值

在使用可选变量之前,应检查其是否为nil

比接受的答案更简短,以及更符合Swift风格的方式,称为可选链

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

1
您可以这样检查它的imageAsset:

if image.imageAsset != nil
{
    // image is not null
}
else 
{
    //image is null
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接