Z
ZHANK
面向协议

泛型 Generics

泛型函数/类型、where 子句约束、关联类型 associatedtype、Opaque 类型 some

泛型 Generics

Swift 泛型类型安全、编译期单态化。where 子句约束,associatedtype 关联类型,some 不透明返回类型。

学完本章你将: 掌握泛型函数/类型、where 约束、associatedtype、some。


泛型函数

swift
func swap<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

var x = 10, y = 20
swap(&x, &y)  // x=20, y=10

var a = "Hello", b = "World"
swap(&a, &b)

泛型类型

swift
struct Stack<Element> {
    private var items = [Element]()

    mutating func push(_ item: Element) { items.append(item) }
    mutating func pop() -> Element? { items.popLast() }
}

var intStack = Stack<Int>()
intStack.push(1)

var stringStack = Stack<String>()
stringStack.push("Hello")

associatedtype

swift
protocol Repository {
    associatedtype Item
    func getAll() -> [Item]
    func get(by id: String) -> Item?
}

struct UserRepository: Repository {
    typealias Item = User  // 可省略(自动推导)
    func getAll() -> [User] { /* ... */ }
    func get(by id: String) -> User? { /* ... */ }
}

some —— 不透明返回类型

swift
// some 隐藏具体类型——调用者只知道"它是某个遵守协议的类型"
func createView() -> some View {
    Text("Hello")  // 返回类型不暴露
}

// 不同于协议类型(有性能损失)
// func createView() -> View { }  // 存在容器——有性能开销