Optional 是 Swift 中的一种特殊类型,可以包含类型 T 的值,也可以完全不包含值(nil)。表示为 T?。它允许明确指示变量可能没有值,并确保在编译阶段检查是否有值。
提取值的机制:
let str: String? = "hello" if let s = str { print(s) }
guard let s = str else { return } print(s)
let s = str!
(如果值为 nil,将可能导致运行时崩溃)
let length = str?.count
??):let value = str ?? "default"
可以将 nil 赋值给 String 类型的变量,而不是 String? 吗?会发生什么?
回答:
不可以,将 nil 赋值给普通类型的变量(String)会导致编译错误。只有 optional 类型可以是 nil,否则会发生编译错误。
示例:
var a: String // a = nil // 编译错误:Nil cannot be assigned to type 'String' var b: String? b = nil // 正确
故事
在应用程序中,强制解包值以为数据库总是会返回正确的响应,当字段缺失时会崩溃。错误通过额外的 optional binding 检查得到解决。
故事
在发送推送通知时,用户名存储在非 optional 变量中,这导致当 API 返回空名称时应用程序崩溃。经过分析,类型替换为 optional,并增加了对 nil 的处理。
故事
在项目中,将 optional 值传递给函数时,参数被声明为非 optional 类型。导致了隐性错误和崩溃。进行了更改:参数类型变为 optional,增加了值存在的检查。