下标可以是泛型,它们能够包含泛型 where
子句。你可以在 subscript
后用尖括号来写占位符类型,你还可以在下标代码块花括号前写 where
子句。例如:
extension Container {
subscript<Indices: Sequence>(indices: Indices) -> [Item]
where Indices.Iterator.Element == Int {
var result: [Item] = []
for index in indices {
result.append(self[index])
}
return result
}
}
这个 Container
协议的扩展添加了一个下标方法,接收一个索引的集合,返回每一个索引所在的值的数组。这个泛型下标的约束如下:
- 在尖括号中的泛型参数
Indices
,必须是符合标准库中的Sequence
协议的类型。 - 下标使用的单一的参数,
indices
,必须是Indices
的实例。 - 泛型
where
子句要求Sequence(Indices)
的迭代器,其所有的元素都是Int
类型。这样就能确保在序列(Sequence
)中的索引和容器(Container
)里面的索引类型是一致的。
综合一下,这些约束意味着,传入到 indices
下标,是一个整型的序列。