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

时间:2016-03-15 20:01:01

标签: 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: NSDataBase64DecodingOptions(rawValue: 0)) // Crashes
}

我也试过isEmpty,它也崩溃了。

4 个答案:

答案 0 :(得分:0)

在尝试使用之前,您应该打开个人信息[“照片”]。这样,您可以确保在没有Photo Key存在值的情况下尝试实例化NSData

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

答案 1 :(得分:0)

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

let dictionary: Dictionary<String, AnyObject> = Dictionary()
if dictionary.keys.count > 0  {
   // This mean dictionary has values.
}

答案 2 :(得分: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
                    }
                }
            }
        }

答案 3 :(得分:0)

问题是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)!
{

}