我有这个错误:
public enum AuthenticationError: Error {
case unknownError
case canceledByUser
case userOrPasswordMismatch
case unableToExtractOneTimeCode
case unableToExchangeOneTimeCodeForToken
case credentialsUnavailable
case expired
case webRequestFailed(error: Error)
}
Run Code Online (Sandbox Code Playgroud)
我想重载==以比较它,但我发现我需要以三种方式重复代码:
public func == (lhs: Error, rhs: AuthenticationError) -> Bool {
return lhs._code == rhs._code && lhs._domain == rhs._domain
}
public func == (lhs: AuthenticationError, rhs: Error) -> Bool
public func == (lhs: AuthenticationError, rhs: AuthenticationError) -> Bool
Run Code Online (Sandbox Code Playgroud)
一个用法示例是:
if let error = error, error == AuthenticationError.expired {
// do something
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法(使用泛型)所以我不需要重复类似的代码?
rob*_*off 19
这足以.expired支票,无需定义==:
let error: Error = ...
if case AuthenticationError.expired = error {
print("it's expired")
}
Run Code Online (Sandbox Code Playgroud)
如果要提取关联数据(如本.webRequestFailed例所示),则可以执行以下操作:
if case AuthenticationError.webRequestFailed(error: let innerError) = error {
print("web request failed due to \(innerError.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)
这是我的macOS游乐场,在Xcode 9.2中创建:
import Foundation
public enum AuthenticationError: Error {
case unknownError
case canceledByUser
case userOrPasswordMismatch
case unableToExtractOneTimeCode
case unableToExchangeOneTimeCodeForToken
case credentialsUnavailable
case expired
case webRequestFailed(error: Error)
}
func test(_ error: Error) {
if case AuthenticationError.expired = error {
print("it's expired; error = \(error)")
} else if case AuthenticationError.webRequestFailed(error: let innerError) = error {
print("web request failed due to \(innerError.localizedDescription); error = \(error)")
} else {
print("no match; error = \(error)")
}
}
test(AuthenticationError.expired)
test(AuthenticationError.webRequestFailed(error: AuthenticationError.credentialsUnavailable))
test(NSError(domain: NSPOSIXErrorDomain, code: Int(ENOENT), userInfo: [:]))
Run Code Online (Sandbox Code Playgroud)
public func == (lhs: Error, rhs: Error) -> Bool {
guard type(of: lhs) == type(of: rhs) else { return false }
let error1 = lhs as NSError
let error2 = rhs as NSError
return error1.domain == error2.domain && error1.code == error2.code && "\(lhs)" == "\(rhs)"
}
extension Equatable where Self : Error {
public static func == (lhs: Self, rhs: Self) -> Bool {
lhs as Error == rhs as Error
}
}
Run Code Online (Sandbox Code Playgroud)
enum MyError: Error { case problem, bigProblem, catastrophicException }
enum MyError2: Error, Equatable { case oops, RUUUUUN(where: String) }
var errors = [Error]()
errors.append(MyError.problem)
errors.append(MyError.catastrophicException)
errors.append(MyError2.oops)
errors.append(MyError2.RUUUUUN(where: "I don't know"))
errors.append(MyError2.RUUUUUN(where: "No matter!!!"))
errors.append(NSError(domain: "domain", code: 234, userInfo: nil))
errors.append(NSError(domain: "domain2", code: 345, userInfo: nil))
for i in 0..<errors.count {
for j in i..<errors.count {
print("==============================================")
print("Error1: \(errors[i])")
print("Error2: \(errors[j])")
let result = errors[i] == errors[j]
print("(Error1 == Error2) = \(result ? "?" : "?" ) ")
}
}
Run Code Online (Sandbox Code Playgroud)
==============================================
Error1: problem
Error2: problem
(Error1 == Error2) = ?
==============================================
Error1: problem
Error2: catastrophicException
(Error1 == Error2) = ?
==============================================
Error1: problem
Error2: oops
(Error1 == Error2) = ?
==============================================
Error1: problem
Error2: RUUUUUN(where: "I don\'t know")
(Error1 == Error2) = ?
==============================================
Error1: problem
Error2: RUUUUUN(where: "No matter!!!")
(Error1 == Error2) = ?
==============================================
Error1: problem
Error2: Error Domain=domain Code=234 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: problem
Error2: Error Domain=domain2 Code=345 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: catastrophicException
Error2: catastrophicException
(Error1 == Error2) = ?
==============================================
Error1: catastrophicException
Error2: oops
(Error1 == Error2) = ?
==============================================
Error1: catastrophicException
Error2: RUUUUUN(where: "I don\'t know")
(Error1 == Error2) = ?
==============================================
Error1: catastrophicException
Error2: RUUUUUN(where: "No matter!!!")
(Error1 == Error2) = ?
==============================================
Error1: catastrophicException
Error2: Error Domain=domain Code=234 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: catastrophicException
Error2: Error Domain=domain2 Code=345 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: oops
Error2: oops
(Error1 == Error2) = ?
==============================================
Error1: oops
Error2: RUUUUUN(where: "I don\'t know")
(Error1 == Error2) = ?
==============================================
Error1: oops
Error2: RUUUUUN(where: "No matter!!!")
(Error1 == Error2) = ?
==============================================
Error1: oops
Error2: Error Domain=domain Code=234 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: oops
Error2: Error Domain=domain2 Code=345 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: RUUUUUN(where: "I don\'t know")
Error2: RUUUUUN(where: "I don\'t know")
(Error1 == Error2) = ?
==============================================
Error1: RUUUUUN(where: "I don\'t know")
Error2: RUUUUUN(where: "No matter!!!")
(Error1 == Error2) = ?
==============================================
Error1: RUUUUUN(where: "I don\'t know")
Error2: Error Domain=domain Code=234 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: RUUUUUN(where: "I don\'t know")
Error2: Error Domain=domain2 Code=345 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: RUUUUUN(where: "No matter!!!")
Error2: RUUUUUN(where: "No matter!!!")
(Error1 == Error2) = ?
==============================================
Error1: RUUUUUN(where: "No matter!!!")
Error2: Error Domain=domain Code=234 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: RUUUUUN(where: "No matter!!!")
Error2: Error Domain=domain2 Code=345 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: Error Domain=domain Code=234 "(null)"
Error2: Error Domain=domain Code=234 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: Error Domain=domain Code=234 "(null)"
Error2: Error Domain=domain2 Code=345 "(null)"
(Error1 == Error2) = ?
==============================================
Error1: Error Domain=domain2 Code=345 "(null)"
Error2: Error Domain=domain2 Code=345 "(null)"
(Error1 == Error2) = ?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3091 次 |
| 最近记录: |