5月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) 这种语法。

写段代码

swift
// if let if let name = user?.name { print(name) // 只在 if 块内可用 } // guard let func 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?
标签:Swift