谈谈 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 | 元类型的类型 | Metatype | Swift 内部类型 |
AnyClass | 任意类的元类型 | AnyObject.Type | 所有 class 的元类型都兼容 |
as?, as, as!
as —— 强制类型转换 / 向上转换
- 向上类型转换(Upcast)
从子类转换为父类、或者从具体类型转换为协议类型,这种转换编译期就能确定安全,永远不会失败。
class Animal {}
class Dog: Animal {}
let dog = Dog()
let animal = dog as Animal // ✅ 安全,向上转换
- 转协议类型
protocol Pet {}
class Dog: Pet {}
let dog = Dog()
let pet = dog as Pet // ✅ 转换为协议类型
- 同样是安全的向上转换。
as表示类型 “符合” ,可以直接使用。
as? 可选类型转换(Optional Cast)
as? 会尝试把类型转换成目标类型:
- 如果类型匹配 → 返回 可选类型包裹的值 (
Dog?) - 如果类型不匹配 → 返回 nil
as?常和if let或guard let一起用,进行安全类型绑定。
可选项的本质是什么?
在 Swift 中 可选类型(Optional)本质上就是一个带关联值的枚举
Swift 标准库中 Optional 的定义大致如下:
enum Optional<Wrapped> {
case none
case some(Wrapped)
}