我正在解析一个 NSDictionary。我不想逐项检查以确保所有内容都确实存在并且没有意外地为零。我想我只是试一试。但是我收到编译器警告。这是我的代码:说:
do {
try adminMsg = NSDictionary(objects: [rawMsg["msg"]!["Title"]!!,
rawMsg["msg"]!["Text"]!!,
rawMsg["msg"]!["Time"]!!],
forKeys: ["Title", "Text", "Time"])
} catch {
adminMsg = nil
}
但是我收到这个警告:
“在‘try’表达式中没有调用抛出函数”
这是否意味着如果字典中缺少某个项目,我别无选择只能崩溃?我不能捕获它并让我的代码优雅地告诉发件人他们给我发送了一个无效的 NSDictionary(除非我在代码中逐项检查它)?
最佳答案
I can't trap it and let my code gracefully tell the sender they sent me an invalid NSDictionary
你不能捕获 fatal error ,不。您可以做的是使用可选绑定(bind)捕获缺失的元素。
guard let title = message["Title"],
let text = message["Text"],
let time = message["Time"]
else {
// Missing data; inform caller
}
这就是您优雅地告诉客户数据有问题的方式。您可以返回 nil
、空字典或抛出错误:以最适合您的方式为准。
为了正确地使用 Swifty,你应该首先定义你的数据:
typealias RawMessage = Dictionary<String, [String : AnyObject]>
/** Important keys in a `RawMessage` */
enum RawMessageKey : String
{
case message = "msg"
case title = "Title"
case text = "Text"
case time = "Time"
}
enum RawMessageError : ErrorType
{
/** The `RawMessage` has no "message" key */
case NoMessage
/** The `RawMessage` is missing an expected inner key */
case MissingKey
}
然后是你的提取函数。这使用可选绑定(bind),而不是强制解包,来检查 key "msg"
是否存在。 无法“捕获”强制解包失败;这不是它的目的。
如果 key 不存在,您将通过抛出自己的错误向调用者发出信号。然后使用进一步的可选绑定(bind)来获取其余项目。如果有任何遗漏,再次抛出错误。
/** Pull important values from `RawMessage` and repackage as `NSDictionary` */
func extractAdminMessage(rawMsg: RawMessage) throws -> NSDictionary
{
guard let message = rawMsg[String(RawMessageKey.message)] else {
throw RawMessageError.NoMessage
}
let keys = [String(RawMessageKey.title),
String(RawMessageKey.text),
String(RawMessageKey.time)]
guard let title = message[String(RawMessageKey.title)],
let text = message[String(RawMessageKey.text)],
let time = message[String(RawMessageKey.time)]
else {
throw RawMessageError.MissingKey
}
return NSDictionary(objects: [title, text, time],
forKeys: keys)
}
如果您愿意,使用 flatMap
可以替代堆叠解除绑定(bind):
let keys = [String(RawMessageKey.title),
String(RawMessageKey.text),
String(RawMessageKey.time)]
let objects = keys.flatMap { message[$0] }
guard objects.count == keys.count else {
throw RawMessageError.MissingKey
}
这里,flatMap
会删除任何缺失值;然后,如果没有与对象相同数量的键,则向您的调用者发出信号。
关于swift - 在 Swift 中你能捕获 "fatal error unexpectedly found nil while unwrapping an optional value"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38805193/