Joe*_*e C 1 try-catch nsdictionary swift
我正在解析 NSDictionary。我不想逐项检查以确保一切都确实存在并且没有任何意外为零。我想我应该尝试一下。但我收到编译器警告。这是我的代码:说:
do {
try adminMsg = NSDictionary(objects: [rawMsg["msg"]!["Title"]!!,
rawMsg["msg"]!["Text"]!!,
rawMsg["msg"]!["Time"]!!],
forKeys: ["Title", "Text", "Time"])
} catch {
adminMsg = nil
}
Run Code Online (Sandbox Code Playgroud)
但我收到这个警告:
“‘try’表达式中没有调用抛出函数”
这是否意味着如果字典中缺少某个项目,我别无选择,只能崩溃?我不能捕获它并让我的代码优雅地告诉发件人他们向我发送了一个无效的 NSDictionary (除非我在代码中逐项检查)?
我无法捕获它并让我的代码优雅地告诉发件人他们向我发送了无效的 NSDictionary
你不能捕获致命错误,不。您可以做的是使用可选绑定来捕获丢失的元素。
guard let title = message["Title"],
let text = message["Text"],
let time = message["Time"]
else {
// Missing data; inform caller
}
Run Code Online (Sandbox Code Playgroud)
这就是您如何优雅地告诉客户数据有问题的方式。您可以返回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
}
Run Code Online (Sandbox Code Playgroud)
然后是你的提取函数。这使用可选绑定(而不是强制解包)来检查密钥是否"msg"存在。强制解包失败无法被“捕获”;这不是它的目的。
如果密钥不存在,您可以通过抛出自己的错误来向调用者发出信号。然后使用进一步的可选绑定来获取其余项目。如果缺少任何一个,则再次抛出错误。
/** 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)
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意,使用flatMap可以替代堆叠解除绑定:
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
}
Run Code Online (Sandbox Code Playgroud)
在这里,任何缺失值都将被删除flatMap;然后,如果没有与对象相同数量的键,则向调用者发出信号。
| 归档时间: |
|
| 查看次数: |
3522 次 |
| 最近记录: |