2015-07-03 4 views
7

zu bekommen, wenn ich eine Wurf Methode haben, etwa so:Wie aus NSError in userinfo catch-Klausel

func doSomethingWithString(string:String) throws { 
    guard string.characters.count > 0 else { 
    throw NSError(domain: "CustomErrorDomain", code: 42, userInfo: ["foo" : "bar"]) 
    } 
    // Do something with string... 
} 

Dann versuche ich es zu nennen und die userInfo zu lesen:

do { 
    try doSomethingWithString("") 
} catch let error as NSError { 
    print(error.domain) 
    print(error.code) 
    print(error.userInfo) 
} 

... es kommt wieder als ein leeres Wörterbuch, (aber die Domain und den Code richtig bestücken):

CustomErrorDomain 
42 
[:] 

aber wenn ich mich hinzufügen n dieser zusätzliche Schritt:

do { 
    try doSomethingWithString("") 
} catch let e { 
    let error = e as NSError 
    print(error.domain) 
    print(error.code) 
    print(error.userInfo) 
} 

... es funktioniert:

CustomErrorDomain 
42 
[foo: bar] 

Weiß jemand, woran das liegen könnte?

FYI - Ich bin auf Xcode 7 Beta 2 (7A121l)

+0

Sehr interessant ... Ich weiß nicht, warum dieses – Kametrixom

+3

passieren könnte ich dies als Fehler betrachten, bitte ein Radar bei bugreport.apple.com Datei. – robertvojta

+1

Okay, @RobertVojta. Ich habe jetzt ein Radar abgelegt. – ganzogo

Antwort

2

Es ist ein Fehler, fest in Xcode 7 Beta 4. Hier ist ein Auszug aus der Release Notes (PDF, Seite 15):

Gelöste Probleme in Xcode 7 beta 4 - Swift 2.0 und Objective-C

Wenn einen Verweis auf eine NSError Instanz in Swift zu werfen, die Swift Laufzeit nicht verliert mehr die userinfo von der ursprüngliche NSError, wenn es als NSError gefangen ist. Die Swift-Laufzeit behält jetzt die Identität des ursprünglichen NSError bei. Zum Beispiel diese Behauptung hält jetzt:

let e = NSError(...) 
do { 
    throw e 
} catch let e2 as NSError { 
    assert(e === e2) 
}