Swift 泛型
在本教程中,我们将通过示例了解 Swift 泛型、如何创建泛型函数和类型及其优点。
Swift 让我们可以创建可用于不同数据类型的单个函数和类(或任何其他类型)。
这有助于我们重用代码。
Swift 泛型函数
在 Swift 中,我们可以创建可用于任何类型数据的函数。这样的函数称为泛型函数。
以下是我们如何在 Swift 中创建泛型函数:
// create a generic function
func displayData<T>(data: T){
...
}
这里,
我们已经创建了一个名为 displayData()
的泛型函数。
尖括号 <>
中使用的 T
称为类型参数。
根据传递给函数的值的类型,T
将替换为该数据类型(Int
、String
等)。
T
。实例:Swift 泛型函数
// create a generic function
func displayData<T>(data: T) {
print("Generic Function:")
print("Data Passed:", data)
}
// generic function working with String
displayData(data: "Swift")
// generic function working with Int
displayData(data: 5)
结果如下:
Generic Function:
Data Passed: Swift
Generic Function:
Data Passed: 5
在上面的实例中,我们创建了一个名为 displayData()
的泛型函数,该函数带有类型参数 <T>
。
现在,当我们调用泛型函数时,
displayData(data: "Swift")
我们已经传递了一个字符串值,因此占位符参数 T
自动替换为 String
。
类似地,当我们将 Int 传递给泛型函数时,
displayData(data: 5)
占位符替换为 Int。
Swift 泛型类
与泛型函数类似,我们还可以创建一个可用于任何类型数据的类。这样的类称为泛型类。
让我们看一个例子,
// create a generic class
class Information<T> {
// property of T type
var data: T
init (data: T) {
self.data = data
}
// method that return T type variable
func getData() -> T {
return self.data
}
}
// initialize generic class with Int data
var intObj = Information<Int>(data: 6)
print("Generic Class returns:", intObj.getData())
// initialize generic class with String data
var strObj = Information<String>(data: "Swift")
print("Generic Class returns:", strObj.getData())
结果如下:
Generic Class returns: 6
Generic Class returns: Swift
在上面的例子中,我们创建了一个名为 Information
的泛型类。此类可用于处理任何类型的数据。
class Information<T> {...}
我们创建了两个 Information
对象
var intObj = Information<Int>(data: 6)
var strObj = Information<String>(data: "Swift")
这里,
intObj
- 类型参数T
被 Int 替换。现在,Information
处理整数数据。stringObj
- 类型参数T
替换为 String。现在,Information
处理字符串数据。
Swift 泛型中的类型约束
通常,类型参数可以接受任何数据类型(Int、String、Double…)。
然而,如果我们只想对某些特定类型使用泛型(例如接受数字类型的数据),那么我们可以使用类型约束。
下面是我们如何创建类型约束:
func addition<T: Numeric>(num1: T, num2: T) {
...
}
这里,<T:Numeric>
向类型参数添加约束。它定义了 T
需要符合数字协议。
Numeric
是 Int 和 Double 等数值的内置协议。实例:类型约束
//create a generic function with type constraint
func addition<T: Numeric>(num1: T, num2: T) {
print("Sum:", num1 + num2)
}
// pass Int value
addition(num1: 5, num2: 10)
// pass Double value
addition(num1: 5.5, num2: 10.8)
结果如下:
Sum: 15
Sum: 16.3
在上面的实例中,我们创建了一个名为 addition()
的泛型函数。注意这个表达式,
<T: Numeric>
这里,泛型函数是用类型约束创建的。这意味着 addition()
只能处理符合 Numeric
协议(Int、Double 等)的数据类型。
argument type 'String' does not conform to the expected type 'Numeric'
。Swift 泛型的优势
1.代码可重用性
借助 Swift 中的泛型,我们可以编写适用于不同类型数据的代码。例如,
func genericFunction<T>(data: T) {...}
这里,我们创建了一个泛型函数。这个函数也可以用于对整数数据、字符串数据等执行操作。
2.用于集合
Swift 数组使用泛型的概念。例如,
// creating a integer type array
var list1: Array<Int> = []
// creating a string type array
var list2: Array<String> = []
这里是保存 Int 值的 list1
数组和保存 String 值的 list2
数组。
与数组类似,字典在 Swift 中也是泛型。