Swift guard else 使用 NULL 值调用字典键

Swift guard else called on dictionary key with NULL value

如果我从包含以下内容的 NSNotification 返回一个字典

print(notificationObj.object)
Optional({
    age = "<null>";
    names =     (
        David
    );
})

然后在尝试将其分配给变量时调用 else 守卫:

guard let categories = notificationObj.object as? [String:[String]] else {
  // Gets to here
  return
}

如何处理字典键为空的情况。

您的词典确实包含...

Optional({
    age = "<null>";
    names =     (
        David
    );
})

...和...

  • age = ...String = String(值为单个String),
  • names = ( ... )String = [String](值是 String 的数组)。

您不能将其转换为 [String:[String]],因为第一对不适合这种类型。这就是为什么您的 guard 语句命中 else.

的原因

很难回答你的问题。字典包含names,你想要categoriesnames键确实包含David,这看起来不像类别,......至少你知道为什么guard 点击 else.

你的问题不是很清楚

不过IF

  • 你有一个字典声明如下[String:[String]]
  • 并且您想管理给定密钥不存在的情况

像这样

let devices : [String:[String]] = [
    "Computers": ["iMac", "MacBook"],
    "Phones": ["iPhone 6S", "iPhone 6S Plus"]
]

那么你至少可以有2种解法

1。条件展开

if let cars = devices["Car"] {
    // you have an array of String containing cars here 
} else {
    print("Ops... no car found")
}

2。守卫让

func foo() {
    guard let cars = devices["Car"] else {
        print("Ops... no car found")
        return
    }
    // you have an array of String containing cars here...
    cars.forEach { print([=12=]) }
}

您打印的 notificationObject.object 似乎是由 JSON 字符串构成的,如下所示:

"{ \"age\": null, \"names\":[\"David\"] }"

您命中 else 子句的原因是 age 实际上是一个 nil,而不是一个有效的字符串数组。我尝试使用 [String: [String]?][String: NSArray?] 两者似乎都不起作用。该类型实际上是一个 NSNull(继承自 NSObject)。

因此您可以转换为 [String: AnyObject] 并像这样检查 NSArray:

if let categories = j as? [String: AnyObject] where (categories["age"] is NSArray) {
    print("age was array")
} else {
    print("age is probably null")
}

如果您的通知对象在值为 null 时简单地省略 "age" 属性,您可能会更好。然后你就可以转换为 [String: [String]].