ErrorUtils
特性
-
⛔️ 不再有长嵌套的 do...try...catch 块。 -
🆗 轻松验证输入。 -
🏷 分类错误。 -
🎁 以更直观的方式展开 optinals。
使用方法
1. 可抛出对象
旧方法
func parse(url: String) throws -> String {
guard let url = URL(string: url) else {
throw ParserError.invalidURL
}
do {
return try String(contentsOf: url)
} catch {
throw ParserError.invalidWebpage
}
}
新方法
func parse(url: String) throws -> String {
guard let url = URL(string: url) else {
throw ParserError.invalidURL
}
return try execute(String(contentsOf: url),
orThrow: Error.invalidWebpage)
}
《execute》方法有三个重载
execute( _: ,orThrow:)
execute( _: ,errorTransform:)
execute( _: ,orCaptureError:)
2. 输入验证器
经常会遇到这种情况
func signup(user: User) {
guard user.username.count >= 3 else {
errorLabel.text = "Username must have at least 3 characters"
return
}
guard user.password.count >= 7 else {
errorLabel.text = "Password must have at least 7 characters"
return
}
// Additional validation like email ...etc
...
authService.signup(user: user) { result in
...
}
}
验证逻辑可能会比我们预期的增长得更快,因此 Validator
来拯救。
我们可以简单地通过以下方式扩展 Validator
来添加我们的自定义验证逻辑
extension Validator where Value == String {
static var password: Validator {
return Validator { string in
try validate(
string.count >= 7,
errorMessage: "Password must contain min 7 characters"
)
// you can add more logig here...
try validate(
string.uppercased() != string,
errorMessage: "Password must contain a lowercased character"
)
}
}
static var username: Validator {
return Validator { string in
try validate(string.count >= 3, errorMessage: "Username must have at least 3 characters")
}
}
}
然后我们可以使用全新的验证器简化我们的注册方法
func signup(user: User) throws {
try validate(user.username, using: .username)
try validate(user.password, using: .password)
authService.signup(user: user) { result in
...
}
}
现在调用该函数
try! execute(signup(user: user)) {
self.errorLabel.text = $0.localizedDescription
}
3. 分类错误
任何符合此协议的 Error
类型都必须实现类型为 ErrorCategory
的 category
属性。
示例
enum NetworkError: Error {
case noInternetConnection
case decodingFailure
case notAuthorized
}
extension NetworkError: CategorizedError {
var category: ErrorCategory {
switch self {
case .noInternetConnection:
return .retryable
case .decodingFailure:
return .notRetryable
case .notAuthorized:
return .requiresLogin
}
}
}
现在我们可以根据错误类型轻松地显示或隐藏重试按钮。
func handle(error: Error) {
// do other stuff
switch error.resolveCategory() {
case .retryable:
break
case .notRetryable:
retryButton.isHidden = true
case .requiresLogin:
performLogin()
}
}
4. 解包 optinals
示例
var path: String?
...
func save() throws {
let path = path.orThrow(Error.invalidPath)
}
安装
CocoaPods
ErrorUtils
可以通过 CocoaPods 获得。要安装,
只需在您的 Podfile 中添加以下行
pod 'ErrorUtils'
Carthage
Carthage 是一个去中心化的依赖管理器,它构建您的依赖并提供二进制框架。
要使用 Carthage 将 ErrorUtils 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它。
github "engali94/ErrorUtils"
运行 carthage update
以构建框架,并将构建的 ErrorUtils.framework
拖入您的 Xcode 项目中。
在您的应用程序目标的“构建阶段”设置选项卡上,单击“+”图标,选择“新建运行脚本阶段”,并添加在 Carthage 入门步骤 4、5 和 6 中提到的框架路径。
Swift 包管理器
要使用 Apple 的Swift 包管理器进行集成,请将以下内容添加到您的Package.swift
中的依赖项:
dependencies: [
.package(url: "https://github.com/engali94/ErrorUtils.git", from: "1.0.0")
]
或者,进入您的 Xcode 项目,选择 Swift Packages
,然后点击 +
图标以搜索 ErrorUtils
。
手动操作
如果您不希望使用任何上述依赖项管理器,您可以将 ErrorUtils
手动集成到项目中。只需将 Sources
文件夹拖入您的 Xcode 项目中。
贡献
欢迎大家贡献
致谢
这里大部分工作受到了 Swiftbysundell 文章的启发。
许可
ErrorUtils 采用 MIT 许可证发布。更多信息请参阅LICENSE。