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,因此属于范围分支而不是格式分支。
文章回复
0 条公开回复