Ios 如何在Swift 2.0中检测空字典而不崩溃?

Ios 如何在Swift 2.0中检测空字典而不崩溃?,ios,swift2,nsdictionary,Ios,Swift2,Nsdictionary,我试图检测来自API的字典是否为空或是否有值,但每当我尝试执行Dict.count时,它就会崩溃 if let personalInfo = self.scanResult?.fields { // personalInfo has 0 values but not nil let image = NSData(base64EncodedString: (personalInfo["Photo"] as? String)!, options: NSDataBase64DecodingOptio

我试图检测来自API的字典是否为空或是否有值,但每当我尝试执行Dict.count时,它就会崩溃

if let personalInfo = self.scanResult?.fields { // personalInfo has 0 values but not nil

let image = NSData(base64EncodedString: (personalInfo["Photo"] as? String)!, options: NSDataBase64DecodingOptions(rawValue: 0)) // Crashes
}

我也尝试了isEmpty,它也在那里崩溃了。

在尝试使用它之前,你应该先打开personalInfo[“Photo”]。通过这种方式,您可以确保在没有照片密钥值的情况下不会尝试实例化NSData

if let personalInfo = self.scanResult?.fields{
    if let encodedString = personalInfo["Photo"] as? String{
        let image = NSData(base64EncodedString: encodedString,options: NSDataBase64DecodingOptions(rawValue:0))
    }
}

我认为最简单的解决方案是检查字典键计数是否大于0。例如:

let dictionary: Dictionary<String, AnyObject> = Dictionary()
if dictionary.keys.count > 0  {
   // This mean dictionary has values.
}
let dictionary:dictionary=dictionary()
如果dictionary.keys.count>0{
//这本词典有价值。
}
您可以使用字典的“计数”。请参阅代码

     if let personalInfo = self.scanResult?.fields {
            if personalInfo.count > 0  {
                if let base64ImageString = personalInfo["Photo"] as? String {
                    if let image = NSData(base64EncodedString: base64ImageString, options: NSDataBase64DecodingOptions(rawValue: 0)) {
                        // do your stuff with image
                    }
                }
            }
        }

问题是self.scanResult.fields显示为NSNull。所以我找到了这三种解决问题的方法

func isNotNull(object:AnyObject?) -> Bool {
        guard let object = object else {
            return false
        }
        return (isNotNSNull(object) && isNotStringNull(object))
    }

    func isNotNSNull(object:AnyObject) -> Bool {
        return object.classForCoder != NSNull.classForCoder()
    }

    func isNotStringNull(object:AnyObject) -> Bool {
        if let object = object as? String where object.uppercaseString == "NULL" {
            return false
        }
        return true
    }
我只是这样称呼:

if self.isNotNSNull((self.scanResult?.fields)!
{

}

我对Swift不是很在行,但看起来你正试图制作一个包含0个数据的图像-为什么?我认为,制作一个只有“0”作为数据的图像将是无用的,而且从定义上讲必然会崩溃。。。我遗漏了什么吗?首先你应该检查你的Dic obj是否为nil,如果不是nil,你可以用这个调用count方法。我不想走那么远,当我看到字典中的值数为0时,就停下来。我应该怎么做?什么类型是self.scanResult?字段?如果它确实是一本swift字典,那么您可以通过personalInfo.count方法检查计数