Swift 入门:通过 Optional 校验分钟数
将文本解析结果表示为 Int?,利用 guard 提前拒绝失败与越界值,理解可选绑定与合法零值的关系。
本节目标
将文本解析结果表示为 Int?,利用 guard 提前拒绝失败与越界值,理解可选绑定与合法零值的关系。
环境与运行方法
准备 Swift 6 工具链。保存为 lesson.swift,执行 swiftc lesson.swift -o lesson 后运行 ./lesson。示例在命令行运行,不依赖 UIKit 或 SwiftUI。
核心思路
Int(text) 可能返回 nil,表示文本不能解析成整数。guard 将前置条件集中在函数开头,通过后主体可以使用非可选数值。业务范围仍需额外验证。
完整示例
func minutes(_ text: String) -> Int? {
guard let value = Int(text), (0...1440).contains(value) else { return nil }
return value
}
for text in ["30", "0", "bad", "1441"] {
if let value = minutes(text) {
print("ok=\(value)")
} else {
print("invalid")
}
}预期输出
ok=30
ok=0
invalid
invalid逐步理解
可选绑定只检查是否存在,不会因为数值为零而失败。闭区间 0...1440 包含两个端点。guard 的失败分支必须离开当前作用域,所以使用 return nil。
本例把格式和范围失败都合并为 nil。需要细分原因时可以使用 Result 或抛出错误。Optional 解决“可能不存在”,并不自动解释为什么不存在,调用设计应与展示需求一致。
常见问题与边界
- 强制解包 ! 不适合正常输入验证。
- ... 与 ..< 的上界包含规则不同。
- 不应把默认零当作所有失败情况的替代。
动手练习
测试 "1440"、"-1" 和空文本。
参考答案
上限通过,负数与空文本失败。若允许首尾空白,可先通过字符串清洗再解析,并把这条规则写进测试。
文章回复
0 条公开回复