在 Swift 中,Collection 是一个表示一组有序值的协议,定义了一个集合类型的通用接口。与数组(Array)、字典(Dictionary)、集合(Set)等具体类型不同,Collection 是一种抽象的、可以适配多种集合类型的协议。
Collection 的核心特点
有序性:集合中的元素是按特定顺序排列的。
迭代性:可以通过迭代器(IteratorProtocol)遍历集合中的元素。
下标访问:支持通过下标访问集合中的元素。
有限性:Collection 必须是有限的集合。
Collection 的定义
Collection 协议的简化定义如下:
protocol Collection: Sequence {
associatedtype Index: Comparable
associatedtype Element
var startIndex: Index { get } // 第一个有效元素的索引
var endIndex: Index { get } // 超出最后一个元素的索引
subscript(position: Index) -> Element { get } // 按索引访问元素
func index(after i: Index) -> Index // 获取下一个索引
}
Index
表示集合中元素的位置。
通常是整数(如 Int),但也可以是其他类型,只要满足 Comparable 协议。
startIndex 和 endIndex
startIndex 是第一个元素的位置。
endIndex 是超出最后一个元素的索引,并不表示实际元素。
subscript
允许通过索引访问集合中的元素。
index(after:)
返回给定索引的下一个索引。
Collection 与其他协议的关系
继承自 Sequence
Collection 是 Sequence 的子协议,因此可以使用 for-in 循环迭代元素。
扩展性
许多常用的操作(如过滤、映射)在 Collection 上已经实现,进一步增强了其功能。
标准库中的 Collection 类型
Swift 的标准库中有多种类型符合 Collection 协议,包括:
Array(数组)
Dictionary(字典)
Set(集合)
String(作为字符集合)
示例:
let array: [Int] = [1, 2, 3, 4]
print(array.startIndex) // 输出:0
print(array.endIndex) // 输出:4
let string = "Hello"
for char in string {
print(char) // 输出:H e l l o
}
实现自定义集合
可以自定义符合 Collection 的类型。例如,实现一个倒序数字集合:
struct Countdown: Collection {
let start: Int
var startIndex: Int { start }
var endIndex: Int { 0 }
func index(after i: Int) -> Int {
i - 1
}
subscript(position: Int) -> Int {
position
}
}
// 使用示例
let countdown = Countdown(start: 5)
for number in countdown {
print(number) // 输出:5 4 3 2 1
}
常用的操作
Collection 协议提供了丰富的操作方法,这些方法在符合 Collection 的类型中均可使用:
1、访问元素
let numbers = [10, 20, 30, 40]
print(numbers[2]) // 输出:30
2、切片操作
let slice = numbers[1...2]
print(slice) // 输出:[20, 30]
3、高级操作
过滤: filter(_:)
映射: map(_:)
规约: reduce(_:_:)
let evens = numbers.filter { $0 % 2 == 0 }
print(evens) // 输出:[10, 20, 30, 40]
Collection 的特性
范围安全
使用 startIndex 和 endIndex 确保操作不会超出范围。
多种表示形式
可以按需实现具体的集合类型。
扩展性
可以结合泛型和协议扩展,编写适用于所有 Collection 类型的代码。
进阶:BidirectionalCollection 和 RandomAccessCollection
Collection 有两个更具体的子协议:
1、BidirectionalCollection
支持向前和向后遍历(如双向链表)。
增加了 index(before:) 方法。
2、RandomAccessCollection
支持常数时间的随机访问(如数组)。
增强了性能,是 Collection 的高级版本。
示例:
let numbers = [10, 20, 30]
if let last = numbers.last {
print(last) // 输出:30
}
总结
Collection 是 Swift 中集合类型的基础协议,为数组、字典等集合类型提供了统一的接口,同时支持用户自定义集合类型。它的强大功能和灵活性使得集合操作更加高效、简洁。