2016-12-26 58 views
6

錯誤協議has only one屬性localizedDescription。 我試圖創建自NSObject和錯誤繼承的自定義對象,但我無法重寫localizedDescription。我怎樣才能做到這一點?如何在Swift 3中重寫localizedDescription以實現自定義錯誤?

此代碼不允許我獲得自定義說明:

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

調用函數「test_my_code」得到意想不到的結果: 「操作無法完成......」。

我該怎麼做才能得到結果「MyError:my test string」?

+0

你會不會需要'override' ? –

+0

你不能擴展新的屬性錯誤,然後讀取? – Honey

+0

@SunilChauhan no。任何來自協議的內容都不應該被覆蓋。添加'override'會中斷編譯。 – Speakus

回答

20

關於新的錯誤橋接功能的文件現在仍然不夠清晰,所以這個答案可能需要在不久的將來,一些更新,但根據SE-0112latest Swift source code,您可能需要使用LocalizedError而非Error和實施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 

除了使用LocalizedError,這個默認的實現原理:

(NSError.swift,上面顯示的鏈接)

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

這是一個有點複雜,雨燕是如何定義_domain_code從任意類型只符合Error,但似乎NSError生成「的操作無法完成......「,對於域和代碼的未知組合。

+0

完美!我正在爲此而掙扎,並製造了醜陋的開關/箱子。奇蹟般有效! – denis631

2

如果自定義類型符合協議CustomStringConvertible,並提供本地化的description,那麼LocalizedError以下擴展可能是有用的:

extension LocalizedError where Self: CustomStringConvertible { 

    var errorDescription: String? { 
     return description 
    } 
} 

示例代碼:

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" 
相關問題