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
,你想要categories
,names
键确实包含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]]
.
如果我从包含以下内容的 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
,你想要categories
,names
键确实包含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]]
.