2017-06-22 127 views
1
的子類

我想要的,對於任何給定Error功能,會給我的這如何檢查是否錯誤是NSError

protocol CustomError { } 

func customDescription(_ error: Error) -> String { 
    switch error { 
    case let customError as CustomError: 
     return "custom error" 
    case ???: 
     return "not subclass of NSError" 
    case let nsError as NSError: 
     return "subclass of NSError" 
    } 
} 

一些以上描述是不是真正的代碼,我不想一個String描述,但是一個Dictionary,但這在問題的上下文中並不重要。

問題是我不知道如何區分Error這是NSError的子類,並且這不是因爲任何快速錯誤可以橋接到NSError。它可能在迅速嗎?

+1

類似(type:of:error)是NSError.Type'可能有效。 –

+0

這是一個類似的問題,因爲[檢查任何'值是否是對象](https://stackoverflow.com/questions/39184911/check-if-any-value-is-object)。 –

+0

我不確定我明白了爲什麼你需要將'NSError'與'Error'情況區分開來(它們是專門設計爲可互操作的) - 你試圖獲得的這個'Dictionary'是什麼? (這對於問題的背景聽起來很重要)。這可能是一個更好的解決方案,而不是試圖用演員來區分這兩種情況。 – Hamish

回答

3

正如你已經注意到了,任何類型的符合Error可橋接 到NSError,因此error is NSError始終是真實的,並鑄造 error as NSError不總是成功。

你可以做什麼是type(of:)檢查動態類型值:

type(of: error) is NSError.Type 

評估爲true如果errorNSError或子類的實例。

2
private protocol _NSError: Error { // private, so _NSError is equal to NSError 
} 

extension NSError: _NSError { 

} 

public func customDescription(_ error: Error) -> String { 
    switch error { 
    case let nsError as _NSError: 
     print(nsError as! NSError) 
     return "NSError" 
    default: 
     return "others" 
    } 
}