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

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" 和空文本。

参考答案

上限通过,负数与空文本失败。若允许首尾空白,可先通过字符串清洗再解析,并把这条规则写进测试。

DISCUSSION

文章回复

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