参考原文:Making String Interpolation Smarter in Swift 6.2: Default Values for Optionals
一句话看懂新特性
旧写法(nil-coalescing)
swift
let name: String? = nil
print("Hi \(name ?? "Guest")") // OK,同类型
新写法(Swift 6.2 插值默认值)
swift
print("Hi \(name, default: "Guest")") // 等价,但支持**异类型**默认值
关键差异:
??
要求左右类型一致;(default:)
把默认值直接当字符串用,无视原始类型!
异类型痛点:旧语法搞不定
swift
let count: Int? = nil
// ❌ 编译失败:Int 与 String 不匹配
print("Count: \(count ?? "Unknown")")
// ✅ Swift 6.2 直接通过
print("Count: \(count, default: "Unknown")") // 输出 "Count: Unknown"
省去了手动 .map(String.init) ?? "Unknown"
的繁琐步骤。
真实场景:用户资料拼接
swift
struct User {
var username: String?
var email: String?
var age: Int?
}
let user = User(username: nil, email: "jane@example.com", age: nil)
print("""
User Info:
- Username: \(user.username, default: "Guest")
- Email: \(user.email, default: "Not provided")
- Age: \(user.age, default: "Unknown")
""")
旧写法对比
swift
"- Username: \(user.username ?? "Guest")"
"- Age: \(user.age.map(String.init) ?? "Unknown")" // 手动 map
新语法一行搞定,可读性大幅提升。
日志 & 调试神器
swift
func logEvent(name: String?, duration: Double?) {
print("Event '\(name, default: "Unnamed")' ran for \(duration, default: "an unknown amount of time")")
}
logEvent(name: nil, duration: nil)
// Output: Event 'Unnamed' ran for an unknown amount of time
无需提前拆包、转换类型,插值处直接给默认值。
语法要点速记
特性 | 说明 |
---|---|
可用版本 | Swift 6.2+ |
插值格式 | (optional, default: 任意表达式) |
类型要求 | 无;默认值会被直接当 String 用 |
与 ?? 共存 |
完全兼容,按场景选择 |
何时用它而非 ??
场景 | 选 (default:) |
选 ?? |
---|---|---|
默认值与 Optional 类型不同 | ✅ | ❌ |
默认值是同类型、已存在 | 皆可 | ✅ 更短 |
需要复杂表达式/函数调用 | ✅ 可读 | ❌ 过长 |
一句话总结
同类型用
??
,异类型或懒得转换时用(default:)
。
Swift 6.2 这个小糖让字符串插值兼顾安全与优雅,再不用为"Optional 转 String"写大段模板代码!