Generics 泛型

泛型代码可以让你写出根据自我需求定义、适用于任何类型的,灵活且可重用的函数和类型

泛型所解决的问题

下面是一个标准的,非泛型函数swapTwoInts,用来交换两个Int值:

1
2
3
4
5
func swapTwoInts(inout a: Int, inout b: Int) 
let temporaryA = a
a = b
b = temporaryA
}

这个函数使用 inout 关键字来交换 a 和 b 的值。

swapTwoInts函数可以交换2个数的值

1
2
3
4
5
6
7
8
9
10
11
12
13
func swapTwoInts(inout a: Int, inout b: Int)
{
let temporaryA = a
a = b
b = temporaryA
}

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, b: &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")

// 输出 "someInt is now 107, and anotherInt is now 3\n"

swapTwoInts函数是非常有用的,但是如果你想交换两个String或者Double,就不得不写更多的函数,如 swapTwoStrings 和 swapTwoDoublesfunctions,如下:

1
2
3
4
5
6
7
8
9
10
11
func swapTwoStrings(inout a: String, inout b: String) {
let temporaryA = a
a = b
b = temporaryA
}

func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}

swapTwoInts、swapTwoStrings、swapTwoDoubles,它们功能是一样的,唯一不同在于他们传入的变量类型不同,分别是Int、String、Double

由于swift的语法严格,是类型安全语言,只有类型一样的两个变量才可以互换值,否则编译器将报错。

泛型函数

泛型函数可以工作于任何类型,如下是泛型函数下交换两个变量的值:

1
2
3
4
5
func swapTwoValues<T>(inout a: T, inout b: T) {
let temporaryA = a
a = b
b = temporaryA
}

我们再对比下之前的函数:

1
2
func swapTwoInts(inout a: Int, inout b: Int) 
func swapTwoValues<T>(inout a: T, inout b: T)

这个函数的泛型版本使用了占位类型名字(通常此情况下用字母T表示) 来代替实际类型名(如Int、String、Double)。

占位类型 T 没有注明是什么类型,但是它提示了 a 和 b 必须是同一类型 T,不管 T 是什么类型,只有当函数 swapTwoValues 每次调用时所传入的实际类型才能决定 T 所代表的类型。

T 用<> 将其括起来,说明T是一个占位命名类型,swift不会去查找命名为T的实际类型。

注意:swap函数存在于 Swift 标准库,并可以在其它类中任意使用。如果你在自己代码中需要类似swapTwoValues函数的功能,你可以使用已存在的交换函数swap函数。

类型参数

在上面的swapTwoValues例子中,占位类型T是一种类型参数的示例。类型参数指定并命名为一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来 <>

而且一旦一个参数类型被指定,它不仅可以定义一个函数的参数类型,还可以作为函数的返回值类型,或者用作函数主体中的注释类型。

被类型参数所代表的占位类型不管函数任何时候被调用,都会被实际类型所替换。

你可以设置多个类型参数,命名在尖括号中,用逗号分开

命名类型参数

简单的情况下,泛型函数需要制定一个展位类型,通常用单一字母 T 来命名类型阐述。

复杂情况下,使用更多的描述类型参数是非常有用的,比如字典类型有两个类型参数,一个是键一个是值。如果你自己写字典,你或许会定义这两个类型参数为 KeyType 和 ValueType,用来记住它们在你的泛型代码中的作用。

注意:请始终使用大写字母开头的驼峰式命名法(例如T和KeyType)来给类型参数命名,以表明它们是类型的占位符,而非类型值。

文章作者: Ammar
文章链接: http://lizhaoloveit.cn/2015/07/22/Generics-%E6%B3%9B%E5%9E%8B/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ammar's Blog
打赏
  • 微信
  • 支付宝

评论