2016-12-26 35 views
6

Hata bildirimi has only one property localizedDescription. NSObject ve Error öğesinden devralınan özel bir nesne oluşturmaya çalıştım ancak localizedDescription öğesini geçersiz kılamıyorum. Bunu nasıl yapabilirim?Swift 3'teki özel Hata için localizedDescription nasıl geçersiz hale getirilir?

Bu kod bana özel açıklama almak için izin vermez:

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) 
} 

çağrılması fonksiyonu "test_my_code" beklenmeyen bir sonuç almak: "işlemi tamamlanamadı ...".

"MyError: test dizgim" sonucunu almak için ne yapmalıyım?

+0

ihtiyacınız olmayacak 'override' ? –

+0

Hata yeni bir özellik ile genişletemez ve bunun yerine bunu okuyamazsınız? – Honey

+0

@SunilChauhan no. Protokolden herhangi bir şey geçersiz kılınmamalıdır. 'Geçersiz kıl' eklemek derlemeyi bozar. – Speakus

cevap

20

yeni Hata köprüleme özelliği hakkında belgeler hala şimdi yeterince açık değildir, bu nedenle bu cevap, yakın gelecekte bazı güncellemeler gerekebilir, ancak SE-0112 ve latest Swift source code göre sen Error yerine LocalizedError kullanmak ve errorDescription uygulamak gerekebilir . LocalizedError kullanarak dışında

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 

, bu varsayılan uygulama çalışır: Swift _domain tanımlar nasıl

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

Biraz karışık (NSError.swift, bağlantı yukarıda gösterilen) ya da Error'a uygun rastgele türlerden _code, ancak NSError "The işlem tamamlanamadı ... "bilinmeyen alan ve kod kombinasyonları için. özel tip protokol CustomStringConvertible uyan ve lokalize description sağlıyorsa

+0

Mükemmel! Bununla uğraşıyordum ve çirkin anahtarlar/vakalar yaptım. ÇALIŞIYOR bir cazibe gibi! – denis631

2

ardından LocalizedError aşağıdaki uzantısı yararlı olabilir:

extension LocalizedError where Self: CustomStringConvertible { 

    var errorDescription: String? { 
     return description 
    } 
} 

örnek kod:

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"