2015-07-03 33 views
7

如果我有一个投掷方法,像这样:如何从NSError获得用户信息的catch子句

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 
[:] 

但如果我加我n这个额外的步骤:

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测试版2(7A121l)

+0

很有趣......不知道为什么这可能发生 – Kametrixom

+3

我认为这是一个错误,请bugreport.apple.com提交雷达。 – robertvojta

+1

好的,@RobertVojta。我现在已经提交了一个雷达。 – ganzogo

回答

2

这是一个错误,固定在Xcode 7 beta 4版本的下面是从发行说明(PDF,第15页)的提取物:

在Xcode 7的β4 解决的问题 - SWIFT 2.0和Objective-C

当 投掷参照夫特一个NSError例如,夫特 运行时不再丢失的用户信息原始的NSError如果是 被捕获为NSError。 Swift运行时现在保留了原始NSError的标识 。例如,这种说法现在持有:

let e = NSError(...) 
do { 
    throw e 
} catch let e2 as NSError { 
    assert(e === e2) 
} 
相关问题