Swift 泛型提供了强大的类型安全和代码复用功能。以下是一些常见的 Swift 泛型用法:
-
类型参数化: 泛型允许你编写可以处理多种数据类型的函数或类,而不需要为每种数据类型编写重复的代码。例如:
func print<T>(_ value: T) { print(value) } print("Hello, world!") // 输出 "Hello, world!" print(42) // 输出 "42"
-
泛型约束: 你可以使用泛型约束来限制泛型类型必须满足某些条件,例如遵循某个协议或具有某个属性。例如:
protocol Printable { func print() } func print<T: Printable>(_ value: T) { value.print() } struct MyStruct: Printable { func print() { print("MyStruct") } } let myStruct = MyStruct() print(myStruct) // 输出 "MyStruct"
-
泛型类型推断: Swift 编译器可以根据上下文自动推断泛型类型,无需显式指定。例如:
let array = [1, 2, 3] array.forEach { print($0) } // 编译器自动推断 $0 为 Int 类型
-
泛型函数: 泛型函数允许你编写可以处理多种数据类型的函数。例如:
func add<T: BinaryInteger>(_ a: T, _ b: T) -> T { return a + b } let result1 = add(1, 2) // result1 是 Int 类型 let result2 = add(1.0, 2.0) // result2 是 Double 类型
-
泛型类: 泛型类允许你编写可以处理多种数据类型的类。例如:
class Box<T> { var value: T init(_ value: T) { self.value = value } } let intBox = Box(1) let doubleBox = Box(1.0)
-
泛型协议: 泛型协议允许你定义一个协议,该协议可以被任何类型实现,只要该类型满足协议中定义的方法。例如:
protocol MyProtocol { associatedtype Item func process(_ item: Item) } struct MyStruct<T>: MyProtocol { typealias Item = T func process(_ item: T) { print("Processing \(item)") } } let myStruct = MyStruct<Int>() myStruct.process(42) // 输出 "Processing 42"
这些只是 Swift 泛型的一些常见用法。通过使用泛型,你可以编写更加灵活、可复用和类型安全的代码。