服务端阅读 05月27日 11:52
Swift 可选类型怎么用?if let、guard let 和 ?? 有什么区别?
可选类型表示"值可能为 nil"。String? 要么是 String 要么是 nil。本质是枚举 Optional<Wrapped>,有 .some(Wrapped) 和 .none 两个 case。Swift 不允许变量为 nil 除非声明为可选类型——编译器强制你处理值缺失的情况。解包方式:if let(安全解包,作用域内可用)、guard let(安全解包,后续可用)、??(提供默认值)、!(强制解包,nil 崩溃)、?.(可选链,nil 时短路)。追问if let 和 guard let 怎么选?if let 适合"有值就处理,没有就跳过"——解包后的变量只在 if 块内可用。guard let 适合"没有值就提前退出"——解包后的变量在 guard 之后整个作用域可用。函数参数验证用 guard let,条件分支用 if let。?? 运算符和 if let 有什么区别??? 适合"没有值就用默认值"——name ?? "unknown",简洁一行。if let 适合"没有值要做复杂处理"——打日志、return、throw。?? 链式使用很方便:a ?? b ?? c ?? "default",依次尝试非 nil 值。隐式解包可选类型 String! 什么时候用?几乎不用。String! 声明后当普通 String 用,但底层仍是 Optional,nil 时崩溃。唯一合理场景:IBOutlet( storyboard 初始化时赋值,之后不会为 nil)和 Objective-C 互操作。新代码用 String? + 显式解包,不要用 String!。可选链 ?. 和可选绑定哪个好?可选链适合"只需要访问一层,nil 就整个返回 nil"——user?.address?.city 返回 String?,简洁。可选绑定适合"需要拿到值做进一步操作"——if let city = user?.address?.city。可选链不改变可选性,结果始终是 Optional。多个可选值怎么一起解包?逗号分隔:guard let a = a, let b = b, let c = c else { return }——所有值都非 nil 才继续。如果需要组合解包,用 guard let (a, b) = optionalTuple 或者逐个解包。Swift 没有 let (a?, b?) = (optA, optB) 这种语法。写段代码// if letif let name = user?.name { print(name) // 只在 if 块内可用}// guard letfunc process(user: User?) { guard let user = user else { return } print(user.name) // 后续都可用}// ?? 默认值let name = user?.name ?? "unknown"// 可选链let city = user?.address?.city // String?// 多个一起解包guard let name = name, let age = age, age >= 18 else { return }// map/flatMap 处理可选值let length = name?.count // Int?let uppercased = name?.uppercased() // String?