9

我正在尝试NSError使用更多信息更新对象。例如,一个 api 调用可能会失败,我想用视图控制器信息(导致错误的方法名称、客户端消息、任何附加信息)更新从 api 类返回的错误对象。字典没有设置方法,UserInfo尝试为字典设置值会引发异常(我相信不符合键值代码)。我想过NSError用更新的用户信息创建一个新对象,但我不确定我是否会丢失信息。

问题

更新 NSError 对象的用户信息字典的最佳方法是什么?

4

3 回答 3

10

快速扩展很容易:

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"])
于 2016-04-08T12:29:37.867 回答
8

规范的方法是自己制作一个新NSError的,然后将原件NSError放在userInfo字典中的 key 下NSUnderlyingErrorKey。这是一个稍微不同的结果,但据我所知,这NSErrors是故意不可变的。

于 2013-08-23T16:08:48.993 回答
7

最简单的方法是获取userInfo字典的可变副本并添加您喜欢的任何内容。然后,您必须创建一个新的NSError(因为没有 setUserInfo: 方法),其域和代码与原始域和代码相同。

于 2013-08-23T16:06:55.503 回答