Như được mô tả trong ghi chú phát hành Xcode 8 beta 6,
Các loại lỗi do Swift xác định có thể cung cấp các mô tả lỗi cục bộ bằng cách áp dụng giao thức LocalizedError mới.
Trong trường hợp của bạn:
public enum MyError: Error {
case customError
}
extension MyError: LocalizedError {
public var errorDescription: String? {
switch self {
case .customError:
return NSLocalizedString("A user-friendly description of the error.", comment: "My error")
}
}
}
let error: Error = MyError.customError
print(error.localizedDescription) // A user-friendly description of the error.
Bạn có thể cung cấp nhiều thông tin hơn nữa nếu lỗi được chuyển thành NSError
(luôn luôn có thể):
extension MyError : LocalizedError {
public var errorDescription: String? {
switch self {
case .customError:
return NSLocalizedString("I failed.", comment: "")
}
}
public var failureReason: String? {
switch self {
case .customError:
return NSLocalizedString("I don't know why.", comment: "")
}
}
public var recoverySuggestion: String? {
switch self {
case .customError:
return NSLocalizedString("Switch it off and on again.", comment: "")
}
}
}
let error = MyError.customError as NSError
print(error.localizedDescription) // I failed.
print(error.localizedFailureReason) // Optional("I don\'t know why.")
print(error.localizedRecoverySuggestion) // Optional("Switch it off and on again.")
Bằng cách áp dụng CustomNSError
giao thức, lỗi có thể cung cấp một userInfo
từ điển (và cả a domain
và code
). Thí dụ:
extension MyError: CustomNSError {
public static var errorDomain: String {
return "myDomain"
}
public var errorCode: Int {
switch self {
case .customError:
return 999
}
}
public var errorUserInfo: [String : Any] {
switch self {
case .customError:
return [ "line": 13]
}
}
}
let error = MyError.customError as NSError
if let line = error.userInfo["line"] as? Int {
print("Error in line", line) // Error in line 13
}
print(error.code) // 999
print(error.domain) // myDomain
MyError
mộtError
đầu tiên và mở rộng nó vớiLocalizedError
sau này? Có một sự khác biệt nếu bạn làm nóLocalizedError
ở nơi đầu tiên?