首页 > 试题广场 >

Swift 1.0 or later 什么是泛型?泛型是用来

[问答题]

Swift 1.0 or later

什么是泛型?泛型是用来解决什么问题的?

推荐

泛型是用来使类型和算法安全的工作的一种类型。在Swift中,在函数和数据结构中都可以使用泛型,例如类、结构体和枚举。

泛型一般是用来解决代码复用的问题。常见的一种情况是,你有一个函数,它带有一个参数,参数类型是A,然而当参数类型改变成B的时候,你不得不复制这个函数。

例如,下面的代码中第二个函数就是复制第一个函数——它仅仅是用String类型代替了Integer类型。

1
2
3
4
5
6
7
8
9
10
func areIntEqual(x: Int, _ y: Int) -> Bool {
return x == y
}
func areStringsEqual(x: String, _ y: String) -> Bool {
return x == y
}
areStringsEqual("ray", "ray") // true
areIntEqual(1, 1) // true

Objective-C开发人员可能想到用NSObject类来解决这个问题,代码如下:

1
2
3
4
5
6
7
8
import Foundation
func areTheyEqual(x: NSObject, _ y: NSObject) -> Bool {
return x == y
}
areTheyEqual("ray", "ray") // true
areTheyEqual(1, 1) // true

这个代码会按照预期的方式工作,但是它在编译时不安全。它允许字符串和整数相比较,像这样:

1
areTheyEqual(1, "ray")

应用程序不会崩溃,但是允许字符串和整数相比较可能不是预想的结果。

通过采用泛型,可以合并这两个函数为一个并同时保持类型安全。下面是代码实现:

1
2
3
4
5
6
func areTheyEqual(x: T, _ y: T) -> Bool {
return x == y
}
areTheyEqual("ray", "ray")
areTheyEqual(1, 1)

上面的例子是测试两个参数是否相等,这两个参数的类型受到约束都必须遵循Equatable协议。上面的代码达到预想的结果,并且防止了传递不同类型的参数。

编辑于 2018-07-12 20:32:34 回复(0)