Swift中的泛型约束--where语句

在泛型的参数列表中通过where子句可以为关联类型定义约束。where子句后跟一个或多个针对关联类型的约束,以及一个或多个类型参数和关联类型之间的相等关系。

下面的例子定义了一个名为 allItemsMatch 的泛型函数,用来检查两个 Container 实例是否包含相同顺序的相同元素。如果所有的元素能够匹配,那么返回 true,否则返回 false

被检查的两个 Container 可以不是相同类型的容器(虽然它们可以相同),但它们必须拥有相同类型的元素。这个要求通过一个类型约束以及一个 where 子句来表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func allItemsMatch<C1: Container, C2: Container>
(_ someContainer: C1, _ anotherContainer: C2) -> Bool
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable {

// 检查两个容器含有相同数量的元素
if someContainer.count != anotherContainer.count {
return false
}

// 检查每一对元素是否相等
for i in 0..<someContainer.count {
if someContainer[i] != anotherContainer[i] {
return false
}
}

// 所有元素都匹配,返回 true
return true
}

关于示例函数的说明:

  1. 函数的类型参数列表要求:
    • C1 必须符合 Container 协议(写作 C1: Container)。
    • C2 必须符合 Container 协议(写作 C2: Container)。
    • C1ItemType 必须和 C2ItemType类型相同(写作 C1.ItemType == C2.ItemType)。
    • C1ItemType 必须符合 Equatable 协议(写作 C1.ItemType: Equatable)。
  2. where子句要求:
    • someContainer 是一个 C1 类型的容器。
    • anotherContainer 是一个 C2 类型的容器。
    • someContaineranotherContainer 包含相同类型的元素。
    • someContainer 中的元素可以通过不等于操作符(!=)来检查它们是否彼此不同。