Swift 面试题

71 阅读3分钟

谈谈 Swift 的闭包

Swift 的闭包是语言级的 Block,类型安全、强编译检查、逃逸闭包自动堆分配、非逃逸闭包可优化到栈,捕获变量比 OC 更智能,ARC 自动管理生命周期。

对于逃逸闭包,会分配在堆上
对于非逃逸闭包,会可以在堆,也可以在栈

Swift 的枚举关联值实现原理

Swift 在内部使用一种 tagged union(带标签的联合体) 来实现这种结构。 这样的枚举相当于

enum Value {
    case int(Int)
    case text(String)
}
struct Value {
    uint8_t tag;   // 哪一个 case
    union {
        Int intValue;
        String stringValue;
    } payload;
};

  • tag 标识当前是哪一个 case(0 -> int, 1 -> text)。

  • payload 存放具体的数据内容(Int 或 String)。

  • 编译器会保证:这个联合体的大小足够容纳所有 case 的最大内容。

Swift 的 Self 和 self 的区别

Self类型的别名,代表“定义这个成员的类型本身”,他是类型占位符。
self 就是当前对象本身的引用,与其他语言的 this 类似。

名称首字母大小写含义使用场景示例
Self大写类型占位符(Type Placeholder) ,代表“当前类型”在类型定义或协议中func copy() -> Self
self小写当前实例(Instance) ,类似于 this在方法或闭包内部print(self.name)

Swift 的 Any 和 AnyObject 的区别

Any 可以表示 任意类型的值,包括:

  • 值类型(Int, Double, Bool, Struct, Enum
  • 引用类型(Class
  • 函数类型(() -> Void

👉 换句话说,只要是 Swift 中的类型,Any 都能装

AnyObject 仅表示 引用类型(class 实例)

也就是说,AnyObject 只能装 Swift 或 Objective-C 的类对象,不能装结构体、枚举、函数、基本类型

X.self | X.Type (X表示类,注意不是对象)

X.self — 获取类型的值(即元类型)

class Dog {}
let type1 = Dog.self  // type1 的类型是 Dog.Type

X.Type — 元类型(Metatype)
X.Type 表示:所有 X 类型 的元类型对象的类型”。

class Dog {}
let a: Dog = Dog()
let b: Dog.Type = Dog.self
名称含义类型举例值
dog实例Dog一个 Dog 对象
Dog.self元类型对象(type object)Dog.Type“Dog 的类型描述”
Dog.Type元类型的类型MetatypeSwift 内部类型
AnyClass任意类的元类型AnyObject.Type所有 class 的元类型都兼容

as?, as, as!

as —— 强制类型转换 / 向上转换
  1. 向上类型转换(Upcast)
    从子类转换为父类、或者从具体类型转换为协议类型,这种转换编译期就能确定安全,永远不会失败。
class Animal {}
class Dog: Animal {}

let dog = Dog()
let animal = dog as Animal // ✅ 安全,向上转换

  1. 转协议类型
protocol Pet {}
class Dog: Pet {}

let dog = Dog()
let pet = dog as Pet // ✅ 转换为协议类型
  • 同样是安全的向上转换。
  • as 表示类型 “符合” ,可以直接使用。
as? 可选类型转换(Optional Cast)

as? 会尝试把类型转换成目标类型:

  • 如果类型匹配 → 返回 可选类型包裹的值 (Dog?)
  • 如果类型不匹配 → 返回 nil
    as? 常和 if letguard let 一起用,进行安全类型绑定。

可选项的本质是什么?

在 Swift 中 可选类型(Optional)本质上就是一个带关联值的枚举
Swift 标准库中 Optional 的定义大致如下:

enum Optional<Wrapped> {
    case none
    case some(Wrapped)
}