Ios 为什么一个值突然变为零?

Ios 为什么一个值突然变为零?,ios,swift,image,Ios,Swift,Image,我正在做一个项目,我想得到一个特定标识符的图像。我有以下功能: func imageForIdentifier(identifier: String?) -> UIImage? { if identifier == nil || identifier! == "" { return nil } let directory = directoryForID(identifier!) if let img

我正在做一个项目,我想得到一个特定标识符的图像。我有以下功能:

func imageForIdentifier(identifier: String?) -> UIImage? {
        if identifier == nil || identifier! == "" {
            return nil
        }
        let directory = directoryForID(identifier!)
        if let img = imgInCache.objectForKey(identifier!) as? UIImage {
            return img
        }
        if let img = NSData(contentsOfFile: directory) {
            return UIImage(data: img)
        }
        return nil
    }
…以及
directoryForID
函数

func directoryForID(identifier: String) -> String {
        let directoryPath: NSURL = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentationDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).first!
        return (directoryPath.URLByAppendingPathComponent(identifier).path!)
    }
如果我传递一个图像标识符,它应该创建一个目录,并且在最后一个If语句中,它应该返回该目录中数据的
UIImage
。但是,它跳过所有if语句并返回nil。即使我传递了正确的标识符,这怎么可能呢


提前感谢您。

原因是您如何测试字符串对象标识符的零能力或空性:

identifier.length有助于验证标识符的内容…

编辑的答案

func imageForIdentifier(identifier: String?) -> UIImage? {

    guard let identifier else { return }

    let directory = directoryForID(identifier)
    if let img = imgInCache.objectForKey(identifier) as? UIImage {
        return img
    }
    if let img = NSData(contentsOfFile: directory) {
        return UIImage(data: img)
    }
    return nil
}

将路径组件附加到
URLsForDirectory
的结果不会自动创建目录。你必须写代码。您的方法是使用
guard
而不是
的一个很好的例子,如果
一个guard语句就可以了,但是如果例程不尝试将一个可选的作为参数,它会更好。一般来说,您不应该将选项作为参数传递。相反,调用方应该在自己的上下文中决定如何解决可选问题。如果您说它应该“创建一个目录”,我想您的意思是它应该创建一个表示目录的URL?代码中的任何内容实际上都不会导致创建目录。甚至比
identifier.length
更好,您可以使用
identifier.isEmpty