如何在Swift 2中检查NSDictionary是否为零

时间:2015-08-19 21:55:54

标签: ios swift

我在我的函数中将NSDictionary作为参数但有问题,因为我不知道如何检查该参数是否为零。

我的功能如下:

func doSmth(val : NSDictionary)

在我的功能中,我试图获得一些价值观:

let action = val["action"] as! String

但是得到错误"致命错误:在打开一个Optional值时意外发现nil"当接收参数val为nil。

4 个答案:

答案 0 :(得分:7)

您还可以访问allKeysallValues属性,并检查数组是否包含如下所示的元素:

let dic = NSDictionary()
let total = dic.allKeys.count

    if total > 0 {

        // Something's in there

    }

    else {

        // Nothing in there
    }

修改

以下是如何检测NSDictionary是否为零,如果它们是关键字,您正在寻找存在,以及它是否尝试访问它的值:

let yourKey = "yourKey"

if let dic = response.someDictionary as? NSDictionary {
    // We've got a live one. NSDictionary is valid.

    // Check the existence of key - OR check dic.allKeys.containsObject(yourKey).
    let keyExists: Bool = false;
    for var key as String in dic.allKeys {

        if key == yourKey {
            keyExists = true;
        }
    }

    // If yourKey exists, access it's possible value.
    if keyExists == true {

       // Access your value
        if let value = dic[yourKey] as? AnyObject {
             // We're in business. We have the value!
        }

        else {
            // yourKey does not contain a value.
        }

    }

    else {
        // yourKey does not exist in NSDictionary.
    }

}

else {
    // Call an ambulance. NSDictionary is nil.
}

答案 1 :(得分:6)

错误是由于假设(强制转换)有时可能为零的值。 Swift非常棒,因为它允许在非常简洁的语句中使用条件展开和条件转换。我推荐以下内容(适用于Swift 1-3):

使用"如果让"有条件地检查"行动"在字典里。

用作?有条件地将值转换为String

if let actionString = val["action"] as? String {
   // action is not nil, is a String type, and is now stored in actionString
} else {
   // action was either nil, or not a String type
}

答案 2 :(得分:0)

你的字典参数可能不是零。问题可能是您的字典没有包含密钥"action"的值。

当您说val["action"]时,字典(作为NSDictionary)会返回Optional<AnyObject>。如果val包含密钥"action",则会返回Some(value)。如果val不包含密钥"action",则会返回None,这与nil相同。

您可以在演员阵容中展开Optional,并使用if-let声明根据是否为零来选择行动方案:

if let action = val["action"] as? String {
    // action is a String, not an Optional<String>
} else {
    // The dictionary doesn't contain the key "action", and
    // action isn't declared in this scope.
}

如果你真的认为val本身可能是零,你需要以这种方式声明你的函数,并且你可以解开val而不用使用有点令人困惑的guard语句重命名它:< / p>

func doSmth(val: NSDictionary?) {
    guard let val = val else {
        // If val vas passed in as nil, I get here.
        return
    }

    // val is now an NSDictionary, not an Optional<NSDictionary>.
    ...
}

答案 3 :(得分:0)

这与Swift 2并不特别相关。

如果字典可以nil将其声明为可选

func doSmth(val : NSDictionary?)

然后使用可选的绑定来检查

if let valIsNonOptional = val {
  let action = valIsNonOptional["action"] as! String
}

如果字典不是nil,代码假定有一个键action包含String