2016-12-26 2 views
6

Fehlerprotokoll has only one Eigenschaft lokalisierteBeschreibung. Ich habe versucht, ein benutzerdefiniertes Objekt zu erstellen, das von NSObject und Error geerbt wurde, aber ich kann localizedDescription nicht überschreiben. Wie kann ich das machen?Wie überschreiben lokalisierteBeschreibung für benutzerdefinierte Fehler in Swift 3?

Dieser Code erlaubt mir nicht, benutzerdefinierte Beschreibung zu erhalten:

class MyError: NSObject, Error { 
    var desc = "" 
    init(str: String) { 
     desc = str 
    } 
    override var description: String { 
     get { 
      return "MyError: \(desc)" 
     } 
    } 
    var localizedDescription: String { 
     get { 
      return self.description 
     } 
    } 
} 

func test_my_code() { 
    let error = MyError(str: "my test string") 
    let x = error as Error 
    print(x.localizedDescription) 
} 

Aufruf Funktion „test_my_code“ unerwartetes Ergebnis: „Der Vorgang konnte nicht abgeschlossen werden ...“.

Was soll ich tun, um das Ergebnis "MyError: my test string" zu erhalten?

+0

Wollen Sie nicht brauchen 'override' ? –

+0

können Sie nicht Error mit einer neuen Eigenschaft erweitern und lesen Sie das stattdessen? – Honey

+0

@SunilChauhan Nr. Alles aus dem Protokoll sollte nicht außer Kraft gesetzt werden. Durch das Hinzufügen von 'override' wird die Kompilierung abgebrochen. – Speakus

Antwort

20

Die Dokumentation über neue Fehler Überbrückung Feature ist genug, um jetzt noch nicht klar, so dass diese Antwort kann einige Updates in naher Zukunft benötigen, sondern nach SE-0112 und den latest Swift source code, können Sie LocalizedError brauchen eher zu verwenden als Error und implementieren errorDescription .

class MyError: NSObject, LocalizedError { 
    var desc = "" 
    init(str: String) { 
     desc = str 
    } 
    override var description: String { 
     get { 
      return "MyError: \(desc)" 
     } 
    } 
    //You need to implement `errorDescription`, not `localizedDescription`. 
    var errorDescription: String? { 
     get { 
      return self.description 
     } 
    } 
} 

func test_my_code() { 
    let error = MyError(str: "my test string") 
    let x = error as Error 
    print(x.localizedDescription) 
} 
test_my_code() //->MyError: my test string 

Anders als LocalizedError Verwendung dieser Standardimplementierung funktioniert:

(NSError.swift, der Link oben gezeigt)

public extension Error { 
    /// Retrieve the localized description for this error. 
    var localizedDescription: String { 
     return NSError(domain: _domain, code: _code, userInfo: nil).localizedDescription 
    } 
} 

Es ist ein wenig kompliziert, wie Swift _domain definiert oder _code von beliebigen Typen, die nur Error entsprechen, aber es scheint, dass NSError generiert "The Operation konnte nicht abgeschlossen werden ... "für unbekannte Kombinationen von Domain und Code.

+0

Perfekt! Ich kämpfte damit und machte hässliche Schalter/Fälle. Klappt wunderbar! – denis631

2

Wenn benutzerdefinierte Typ Protokoll entspricht CustomStringConvertible und bietet lokalisierte description, dann ist die folgende Erweiterung von LocalizedError könnte nützlich sein:

extension LocalizedError where Self: CustomStringConvertible { 

    var errorDescription: String? { 
     return description 
    } 
} 

Beispielcode:

class MyError: LocalizedError, CustomStringConvertible { 

    let desc: String 

    init(str: String) { 
     desc = str 
    } 

    var description: String { 
     let format = NSLocalizedString("Operation error: %@", comment: "Error description") 
     return String.localizedStringWithFormat(format, desc) 
    } 
} 


let error = MyError(str: "my test string") 
let x = error as Error 
print(x.localizedDescription) // Prints "Operation error: my test string" 
print(String(describing: x)) // Prints "Operation error: my test string"