2015-07-03 10 views
7

Se ho un metodo di lancio, in questo modo:Come arrivare userInfo da NSError nella clausola 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... 
} 

Allora provo a chiamarlo e leggere il userInfo:

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

... torna come un dizionario vuoto, (ma il dominio e il codice sono compilati correttamente):

CustomErrorDomain 
42 
[:] 

Ma se aggiungo io n questo ulteriore passaggio:

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

... funziona:

CustomErrorDomain 
42 
[foo: bar] 

Qualcuno sa perché questo potrebbe essere?

FYI - Sono in Xcode 7 beta 2 (7A121l)

+0

Molto interessante ... Non so perché questo possa accadere – Kametrixom

+3

considero questo come un bug, si prega di presentare un radar a bugreport.apple.com. – robertvojta

+1

Ok, @RobertVojta. Ora ho depositato un radar. – ganzogo

risposta

2

E 'un bug, fissata in Xcode 7 Beta 4. Ecco estratti dalle note di rilascio (PDF, pagina 15):

Problemi risolti in Xcode 7 beta 4 - Swift 2.0 e Objective-C

Quando gettando un riferimento a un'istanza NSError a Swift, il runtime Swift non perde userInfo di il messaggio NSError originale se è stato rilevato come errore NSError . Il runtime di Swift ora conserva l'identità di l'errore NSE originale. Ad esempio, questa affermazione detiene ora:

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