Optional 是一种类型,它要么持有一个值,要么持有 nil(无值)。Swift 在类型系统中把 nil 显式化:String 永远不可能是 nil,但 String? 可以。这就是 Swift 在编译期消除大多数空指针崩溃的方式。
Optional 是一种类型,它要么持有一个值,要么持有 nil(无值)。Swift 在类型系统中把 nil 显式化:String 永远不可能是 nil,但 String? 可以。这就是 Swift 在编译期消除大多数空指针崩溃的方式。
在底层,Int? 是一个带有两种 case 的枚举:.some(value) 或 .none。你不能直接使用被包裹的值——必须先解包它。
var name: String? = "Ada" // Optional String, currently .some("Ada")
var missing: String? = nil // .none
// if let: bind only when non-nil, scoped to the block
if let name = name {
print(name.count) // safe: name is a plain String here
}
// guard let: unwrap or exit early — keeps the happy path un-nested
func greet(_ input: String?) {
guard let input else { return } // Swift 5.7 shorthand
print("Hi \(input)") // input is non-optional below
}
// nil-coalescing: supply a default
let display = name ?? "Anonymous"
! 运算符会强制解包:如果 name 为 nil,name! 会崩溃。只有当某个值由程序逻辑保证存在时才使用它——否则优先使用 if let、guard let 或 ??。
let url = URL(string: "https://a.com")! // OK: literal is always valid
let user = fetchUser()! // BAD: crashes on nil
String!)在其为 nil 时被访问会静默崩溃——常见于 @IBOutlet。user?.address?.city 会短路为 nil 而不是崩溃。Optional 把「这个值可能不存在」编码进了类型中,因此编译器会强制你处理空的情况。面试官借此考察你是否会主动使用 guard let 和 ??,而不是到处撒 !——这正是一个易崩溃的 app 与一个安全的 app 之间的区别。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠