如果我有投掷方法,就像这样:
func doSomethingWithString(string:String) throws {
guard string.characters.count > 0 else {
throw NSError(domain: "CustomErrorDomain", code: 42, userInfo: ["foo" : "bar"])
}
// Do something with string...
}
然后我尝试调用它并阅读userInfo
:
do {
try doSomethingWithString("")
} catch let error as NSError {
print(error.domain)
print(error.code)
print(error.userInfo)
}
...它以空字典形式返回(但域和代码已正确填充):
CustomErrorDomain
42
[:]
但如果我加上这个额外的步骤:
do {
try doSomethingWithString("")
} catch let e {
let error = e as NSError
print(error.domain)
print(error.code)
print(error.userInfo)
}
......它有效:
CustomErrorDomain
42
[foo: bar]
有人知道为什么会这样吗?
仅供参考 - 我正在使用Xcode 7 beta 2(7A121l)
答案 0 :(得分:2)
这是一个错误,已在Xcode 7 Beta 4中修复。以下是发行说明(PDF,第15页)中的摘录:
Xcode 7 beta 4中已解决的问题 - Swift 2.0和Objective-C
当 抛出对Swift中的NSError实例的引用,即Swift 运行时不再丢失原始NSError的userInfo(如果是) 被捕为NSError。 Swift运行时现在保留了它的标识 原始的NSError。例如,这个断言现在成立:
let e = NSError(...)
do {
throw e
} catch let e2 as NSError {
assert(e === e2)
}