DevCN
菜单
全部文章快讯开发科技深度热点

Swift Result:为解析失败提供明确错误类型

用枚举描述格式和范围错误,以 Result 返回成功值或失败原因,借助 switch 明确处理所有结果。


本节目标

用枚举描述格式和范围错误,以 Result 返回成功值或失败原因,借助 switch 明确处理所有结果。

环境与运行方法

准备 Swift 6 工具链。保存为 lesson.swift,执行 swiftc lesson.swift -o lesson 后运行 ./lesson。示例在命令行运行,不依赖 UIKit 或 SwiftUI。

核心思路

当界面需要区分不同失败原因时,单个 nil 不够。Error 枚举建立稳定分类,Result 将成功的整数与错误类型绑在一起,避免字符串提示驱动业务逻辑。

完整示例

enum ParseError: Error { case format, range }
func parse(_ text: String) -> Result<Int, ParseError> {
    guard let value = Int(text) else { return .failure(.format) }
    guard (0...1440).contains(value) else { return .failure(.range) }
    return .success(value)
}
for text in ["30", "x", "1441"] {
    switch parse(text) {
    case .success(let value): print("ok=\(value)")
    case .failure(.format): print("error=format")
    case .failure(.range): print("error=range")
    }
}

预期输出

ok=30
error=format
error=range

逐步理解

第一个 guard 处理语法解析,第二个检查业务范围,两者不会互相覆盖。switch 对每种结果单独输出,错误枚举可以保持稳定,而界面文案以后可以翻译或调整。

Result 并不意味着操作一定异步;这里完全同步。异步等待、错误表达和线程安排是不同维度,应避免把看到 Result 当成后台任务的信号。真正接口输入还需限制长度并处理更多协议约束。

常见问题与边界

  • 不要用 try? 一律丢弃需要展示的错误原因。
  • 默认分支可能掩盖新增错误类型。
  • 错误分类应该面向调用者需要采取的动作。

动手练习

输入改成 "0"、"-1"、"1440"。

参考答案

输出成功零、范围错误、成功 1440。负数能解析成 Int,因此属于范围分支而不是格式分支。

下载推广海报

文章推广海报

《Swift Result:为解析失败提供明确错误类型》完整推广海报
DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。