编程iOS 开发者

什么是 Swift 中的 optional?请讲讲安全提取值的机制以及使用 optional 时的典型陷阱。

用 Hintsage AI 助手通过面试

回答。

Optional 是 Swift 中的一种特殊类型,可以包含类型 T 的值,也可以完全不包含值(nil)。表示为 T?。它允许明确指示变量可能没有值,并确保在编译阶段检查是否有值。

提取值的机制:

  • Optional binding:
let str: String? = "hello" if let s = str { print(s) }
  • Guard binding:
guard let s = str else { return } print(s)
  • Force unwrapping:
let s = str!

(如果值为 nil,将可能导致运行时崩溃)

  • Optional chaining:
let length = str?.count
  • Nil coalescing operator (??):
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,增加了值存在的检查。