泛型能根据自定义的需求编写出使用于任意类型的、灵活可复用的函数及类型。它能够避免让你编写重复的代码,用一种更清晰和抽象的方式来表达代码的意图。
例如:siwift 中的以数组(Array)和 字典(Dictionary)他们都是泛型的集合代表。它们在使用的过程中元素可以是Int类型、String类型等等,如果不使用泛型我们可能需要每次都得写一个针对你所需要的方法。但是使用了泛型不用写重复的代码。代码如下:
1、假设我们需要交换两个Int类型
的值,所以就定义了下边的方法。(非泛型例子)
func swapTwoInts(_ a: inout Int,_ b: inout Int){
let temporaryA = a
a = b
b = temporaryA
}
2、后来又需要把两个String类型
的值进行交换,所以就又定义了下边的方法。(非泛型例子)
func swapTwoString(_ a: inout String,_ b: inout String){
let temporaryA = a
a = b
b = temporaryA
}
3、如果按照这样推算是不是所需要传入的参数一发生变化就得写一个方法吗?那不是写了很多重复的代码吗?所以用泛型简化一下吧。(泛型例子)
#这里的下划线_是把参数名称个忽略了。
func swapTwoValues<T>(_ a: inout T,_ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
4、泛型在使用时候需要注意事项。
就拿上边的泛型例子来讲,使用的时候参数必须是同一个类型的,否则你传不同的两个类型是会报错的。因为泛型可以自定推断类型。
正确的使用,参数类型是一样的:
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
错误的使用如下:
var someInt = 3
var anotherString = "world"
swapTwoValues(&someInt, &anotherString)
注释:
上边的例子会报错Cannot convert value of type 'String' to expected argument type 'Int'
5、最后总结
1.采用了泛型的函数使用
T
占位符来进行占位。使用方式是后缀添加<T>
。
2.方法参数可以接受任意类型的值但是必须是相同类型的值
。
3.参数使用inout
修饰的时候在调用的时候必须在参数前边加&
。