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
。这就是为什么在尝试将 image
与 nil
进行比较时出现错误的原因。您需要将变量显式定义为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 设置动画