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

Ios 如何检查Swift 2中的NSDictionary是否为零,ios,swift,Ios,Swift,我将NSDictionary作为函数中的参数,但有问题,因为我不知道如何检查该参数是否为零 我的函数如下所示: func doSmth(val : NSDictionary) 在我的函数中,我试图获得一些值: let action = val["action"] as! String 但当接收参数val为nil时,出现错误“致命错误:在展开可选值时意外发现nil”。您的字典参数可能不是nil。问题可能是您的字典不包含键“action”的值 当您说val[“action”]时,字典(作为NSD

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

我的函数如下所示:

func doSmth(val : NSDictionary)
在我的函数中,我试图获得一些值:

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

但当接收参数val为nil时,出现错误“致命错误:在展开可选值时意外发现nil”。

您的字典参数可能不是nil。问题可能是您的字典不包含键
“action”
的值

当您说
val[“action”]
时,字典(作为
NSDictionary
)返回一个
可选的
。如果
val
包含键
“action”
,则返回
Some(value)
。如果
val
不包含键
“action”
,则返回
None
,与nil相同

您可以打开演员阵容中的
可选
,并使用
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.
}
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>.
    ...
}

这与Swift 2没有特别的关系

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

func doSmth(val : NSDictionary?)
然后使用可选绑定进行检查

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

代码假定有一个键
操作
包含一个
字符串
值,如果字典不是nil

则错误是由于假定(强制转换)一个有时可能为nil的值。Swift非常棒,因为它允许在非常简洁的语句中进行条件展开和条件转换。我建议如下(对于Swift 1-3):

使用“if let”有条件地检查字典中的“action”

用作?将值有条件地强制转换为字符串

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
}

您还可以访问
allKeys
allValues
属性,并检查数组是否包含以下元素:

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

    if total > 0 {

        // Something's in there

    }

    else {

        // Nothing in there
    }
编辑

以下是如何检测NSDictionary是否为nil、您要查找的密钥是否存在以及它是否尝试访问其值:

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.
}

“dic.allkey.count”是我想要的。谢谢这回答了问题标题,但不是问题正文。这个问题特别提到检查字典中的特定参数。然而,这个解决方案对于很多其他关于字典检查的情况是有用的。我听到了你的话,但是MangtasG说他遇到了问题,“因为不知道如何检查参数是否不是nil”。他所指的参数属于NSDictionary类型。在我的回答中,我演示了如何通过检查是否有任何键来检查NSDictionary是否为nil。我相信这是判断你是否有有效词典的最好方法。然而,我只在我的评论中指定“没有任何内容”。我会更新我的答案,以反映我的答案和曼塔斯的问题之间的联系。嘿,布兰登,我只是想跟进一下,因为它又回到了我评论的顶部。从技术上讲,通过循环键来检查是否存在并不一定有效。字典(尽管谷歌的一位采访者告诉我不是这样的,但字典集)是由哈希支持的,用于唯一的检查。也就是说查找是O[1]:)谢谢Rob,以前从未遇到过警卫声明。。。为了学术目的,我将研究这一点:)我相信评论中有一点不正确://词典没有包含用val[“action”]As编写的键“action”?字符串中,“as?”有条件地将val[“action”]强制转换为字符串。这意味着,在val字典中可能确实存在一个“action”键,但它不是String类。如果我错了,请纠正我。