Swift 3必看:Error與NSError的關係
在學習Swift 3的過程中整理了一些筆記,如果想看其他相關文章可前往《Swift 3必看》系列目錄
在之前的版本中,Swift中Error與OC中NSError的關係就像上海的南京路與南京的上海路關係一樣,那就是沒有關係。
我們先來看兩者的區別。
Error是一個實現ErrorProtocol列舉,對外能夠獲取的具體資訊只有rawValue。
enum HomeworkError : Int, Error {
case forgotten
case lost
case dogAteIt
}
但是我們知道NSError是有UserInfo和domain的:
throw NSError(code: HomeworkError.dogAteIt.rawValue,
domain: HomeworkError._domain,
userInfo: [ NSLocalizedDescriptionKey : "the dog ate it" ])
如果OC中的NSError橋接到Swift中,變成Error型別,那麼獲取NSError中的UserInfo資訊也變成了一件頭疼的事情,比如AVError:
catch let error as NSError where error._domain == AVFoundationErrorDomain
&& error._code == AVFoundationErrorDomain.diskFull.rawValue {
// okay: userInfo is finally accessible, but still weakly typed
}
很顯然,解決方式就是提供一個方式可以讓這兩個型別可以無損的轉換。
LocalizedError
增加了一個LocalizedError協議。這個協議增加了errorDescription屬性。如果Error同時實現這個協議,相比原來只有rawValue就增加了更多的資訊。
extension HomeworkError : LocalizedError {
var errorDescription: String? {
switch self {
case .forgotten: return NSLocalizedString("I forgot it")
case .lost: return NSLocalizedString("I lost it")
case .dogAteIt: return NSLocalizedString("The dog ate it")
}
}
}
這個協議同時還有三個屬性:failureReason、helpAnchor、recoverySuggestion。
在NSError中也有對應的三個屬性:
@property (readonly, copy) NSString *localizedDescription;
@property (nullable, readonly, copy) NSString *localizedFailureReason;
@property (nullable, readonly, copy) NSString *localizedRecoverySuggestion;
CustomNSError
CustomNSError 用來橋接原來NSError中的code、domain、UserInfo。
public protocol CustomNSError : Error {
/// The domain of the error.
public static var errorDomain: String { get }
/// The error code within the given domain.
public var errorCode: Int { get }
/// The user-info dictionary.
public var errorUserInfo: [String : Any] { get }
}
如果想讓我們的自定義Error可以轉成NSError,實現CustomNSError就可以完整的as成NSError。
RecoverableError
這次還給Error增加了RecoverableError協議。用來提示使用者可以通過什麼樣的方式來處理這個Error。
歡迎關注我的微博:@沒故事的卓同學
相關連結:
SE-0112:Improved NSError Bridging
相關文章
- Swift 3必看:sizeof移進MemoryLayoutSwift
- Swift 3必看:sizeof 移進 MemoryLayoutSwift
- Swift 3必看:typealias支援泛型Swift泛型
- Swift 3必看:新的訪問控制fileprivate和openSwift
- Swift 3必看:dynamicType廢除,用type(of:)代替Swift
- NSError ** 與 throws 的三個問題Error
- CKPT、DBWn、LGWR與3S的關係
- Swift 3必看:@noescape走了, @escaping來了SwiftAPI
- 與if的關係
- Swift 3必看:集合方法flatten()重新命名為joined()Swift
- 關聯關係與依賴關係的區別
- Swift 3必看:從使用場景瞭解GCD新APISwiftGCAPI
- NSException和NSErrorExceptionError
- Scala與Java的關係Java
- Object與Class的關係Object
- sip與openser的關係
- act與zsh的關係
- SQL與NoSQL(關係型與非關係型)資料庫的區別SQL資料庫
- 行高與字型的關係
- create 與 store中的關係
- oracle datafile 與 object的關係OracleObject
- CQRS與OO思想的關係
- AIX aio與listener 的關係AI
- Socket與TCP/IP的關係TCP
- JRE 與 JVM 的關係JVM
- ERP 與 SAP的關係
- 圖片與向量的關係
- GNU與Linux 的關係Linux
- Cookie與Session 關係CookieSession
- 互動與關係
- hpe或hp與hp 3par的關係初識之一
- 從矩陣與空間操作的關係理解CSS3的transform矩陣CSSS3ORM
- 父表修改與外來鍵的關係(主鍵DML與外來鍵的關係)
- 資料庫 - 關係代數與關係運算資料庫
- CRM與ERP的整合與關係(轉)
- Excutors 與 ThreadPoolExcutor 的關係與區別thread
- ARM 與 STM32 的關係
- JSON 與 JS 物件的關係JSON物件