我在我的函数中将NSDictionary作为参数但有问题,因为我不知道如何检查该参数是否为零。
我的功能如下:
func doSmth(val : NSDictionary)
在我的功能中,我试图获得一些价值观:
let action = val["action"] as! String
但是得到错误"致命错误:在打开一个Optional值时意外发现nil"当接收参数val为nil。
答案 0 :(得分:7)
您还可以访问allKeys
或allValues
属性,并检查数组是否包含如下所示的元素:
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
值