我正在尝试NSError
使用更多信息更新对象。例如,一个 api 调用可能会失败,我想用视图控制器信息(导致错误的方法名称、客户端消息、任何附加信息)更新从 api 类返回的错误对象。字典没有设置方法,UserInfo
尝试为字典设置值会引发异常(我相信不符合键值代码)。我想过NSError
用更新的用户信息创建一个新对象,但我不确定我是否会丢失信息。
问题
更新 NSError 对象的用户信息字典的最佳方法是什么?
我正在尝试NSError
使用更多信息更新对象。例如,一个 api 调用可能会失败,我想用视图控制器信息(导致错误的方法名称、客户端消息、任何附加信息)更新从 api 类返回的错误对象。字典没有设置方法,UserInfo
尝试为字典设置值会引发异常(我相信不符合键值代码)。我想过NSError
用更新的用户信息创建一个新对象,但我不确定我是否会丢失信息。
更新 NSError 对象的用户信息字典的最佳方法是什么?
快速扩展很容易:
extension NSError {
func addItemsToUserInfo(newUserInfo: Dictionary<String, String>) -> NSError {
var currentUserInfo = userInfo
newUserInfo.forEach { (key, value) in
currentUserInfo[key] = value
}
return NSError(domain: domain, code: code, userInfo: currentUserInfo)
}
}
用法:
var yourError = NSError(domain: "com.app.your", code: 999, userInfo: nil)
yourError = yourError.addItemsToUserInfo(["key1":"value1","key2":"value2"])
规范的方法是自己制作一个新NSError
的,然后将原件NSError
放在userInfo
字典中的 key 下NSUnderlyingErrorKey
。这是一个稍微不同的结果,但据我所知,这NSErrors
是故意不可变的。
最简单的方法是获取userInfo
字典的可变副本并添加您喜欢的任何内容。然后,您必须创建一个新的NSError
(因为没有 setUserInfo: 方法),其域和代码与原始域和代码相同。