ErrorUtils 1.0.1

ErrorUtils 1.0.1

Ali A. Hilal 维护。



  • Ali A. Hilal

Swift 5.0 Version Platform Carthage Compatible SPM

ErrorUtils

🥱减少 do...try...catch 代码的复杂度。

特性

  • ⛔️不再有长嵌套的 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 类型都必须实现类型为 ErrorCategorycategory 属性。

示例

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