Swift 泛型

在本教程中,我们将通过示例了解 Swift 泛型、如何创建泛型函数和类型及其优点。

Swift 让我们可以创建可用于不同数据类型的单个函数和类(或任何其他类型)。

这有助于我们重用代码。


Swift 泛型函数

在 Swift 中,我们可以创建可用于任何类型数据的函数。这样的函数称为泛型函数。

以下是我们如何在 Swift 中创建泛型函数:

  1. // create a generic function
  2. func displayData<T>(data: T){
  3. ...
  4. }

这里,

我们已经创建了一个名为 displayData() 的泛型函数。

尖括号 <> 中使用的 T 称为类型参数。

根据传递给函数的值的类型,T 将替换为该数据类型(IntString 等)。

注意:我们可以为类型参数提供任何名称:<S>、<Element> 等。但通常我们使用 T

实例:Swift 泛型函数

  1. // create a generic function
  2. func displayData<T>(data: T) {
  3. print("Generic Function:")
  4. print("Data Passed:", data)
  5. }
  6. // generic function working with String
  7. displayData(data: "Swift")
  8. // generic function working with Int
  9. displayData(data: 5)

结果如下:

  1. Generic Function:
  2. Data Passed: Swift
  3. Generic Function:
  4. Data Passed: 5

在上面的实例中,我们创建了一个名为 displayData() 的泛型函数,该函数带有类型参数 <T>

现在,当我们调用泛型函数时,

  1. displayData(data: "Swift")

我们已经传递了一个字符串值,因此占位符参数 T 自动替换为 String

类似地,当我们将 Int 传递给泛型函数时,

  1. displayData(data: 5)

占位符替换为 Int


Swift 泛型类

与泛型函数类似,我们还可以创建一个可用于任何类型数据的类。这样的类称为泛型类。

让我们看一个例子,

  1. // create a generic class
  2. class Information<T> {
  3. // property of T type
  4. var data: T
  5. init (data: T) {
  6. self.data = data
  7. }
  8. // method that return T type variable
  9. func getData() -> T {
  10. return self.data
  11. }
  12. }
  13. // initialize generic class with Int data
  14. var intObj = Information<Int>(data: 6)
  15. print("Generic Class returns:", intObj.getData())
  16. // initialize generic class with String data
  17. var strObj = Information<String>(data: "Swift")
  18. print("Generic Class returns:", strObj.getData())

结果如下:

  1. Generic Class returns: 6
  2. Generic Class returns: Swift

在上面的例子中,我们创建了一个名为 Information 的泛型类。此类可用于处理任何类型的数据。

  1. class Information<T> {...}

我们创建了两个 Information 对象

  1. var intObj = Information<Int>(data: 6)
  2. var strObj = Information<String>(data: "Swift")

这里,

  • intObj - 类型参数 TInt 替换。现在,Information 处理整数数据。

  • stringObj - 类型参数 T 替换为 String。现在,Information 处理字符串数据。


Swift 泛型中的类型约束

通常,类型参数可以接受任何数据类型(IntStringDouble…)。

然而,如果我们只想对某些特定类型使用泛型(例如接受数字类型的数据),那么我们可以使用类型约束。

下面是我们如何创建类型约束:

  1. func addition<T: Numeric>(num1: T, num2: T) {
  2. ...
  3. }

这里,<T:Numeric> 向类型参数添加约束。它定义了 T 需要符合数字协议。

注意NumericIntDouble 等数值的内置协议。
实例:类型约束
  1. //create a generic function with type constraint
  2. func addition<T: Numeric>(num1: T, num2: T) {
  3. print("Sum:", num1 + num2)
  4. }
  5. // pass Int value
  6. addition(num1: 5, num2: 10)
  7. // pass Double value
  8. addition(num1: 5.5, num2: 10.8)

结果如下:

  1. Sum: 15
  2. Sum: 16.3

在上面的实例中,我们创建了一个名为 addition() 的泛型函数。注意这个表达式,

  1. <T: Numeric>

这里,泛型函数是用类型约束创建的。这意味着 addition() 只能处理符合 Numeric 协议(IntDouble 等)的数据类型。

注意:如果我们尝试传递其他类型,比如 String,我们会得到一个错误:argument type 'String' does not conform to the expected type 'Numeric'

Swift 泛型的优势

1.代码可重用性

借助 Swift 中的泛型,我们可以编写适用于不同类型数据的代码。例如,

  1. func genericFunction<T>(data: T) {...}

这里,我们创建了一个泛型函数。这个函数也可以用于对整数数据、字符串数据等执行操作。

2.用于集合

Swift 数组使用泛型的概念。例如,

  1. // creating a integer type array
  2. var list1: Array<Int> = []
  3. // creating a string type array
  4. var list2: Array<String> = []

这里是保存 Int 值的 list1 数组和保存 String 值的 list2 数组。

与数组类似,字典在 Swift 中也是泛型。