Sequence
是集合类数据结构中的一个基础协议。
协议是个什么东西?
我们使用一个比较简单的协议来举个例子:Equatable
协议。
其定义为:
public protocol Equatable {
public static func ==(lhs: Self, rhs: Self) -> Bool
}
在String
和Int
中我们可以找到,但是并看不到具体实现。但是我们可以知道 2个str相等那么就必须str的每个字母都相同,2个int相等没啥好说的。那么比较2个字典呢,我们到头文件里面看,他分别是key和value遵守了这个协议。还有其他类型的数据结构,我们也可以遵守这个协议,并实现相应的方法。
从此我们可以理解为定义协议就是为了让我们更好的用更自然更统一的方式去表达相近的逻辑,更好的管理面向对象编程中比较类似逻辑的一种手段(纯属个人理解,不喜勿喷)。比如 2==2 、 [] == [] 、 小明 == 小明 我们程序中判断2个东西是否相同,这个相同就可以用==
表示,具体怎么相同我们规定了一个比较函数,具体比较规则自己去实现。
一个简单例子:
struct MLJ: Equatable {
var a: String = ""
var b: String = ""
static public func ==(lhs: MLJ, rhs: MLJ) -> Bool {
if lhs.a == rhs.a && lhs.b == rhs.b {
return true
} else {
return false
}
}
}
满足Sequence 协议的要求十分简单,你需要做的所有事情就是提供一个返回迭代器 的makeIterator()
方法。
// 每次产生一个 99 的迭代器
struct AIterator: IteratorProtocol {
typealias Element = Int
mutating func next() -> AIterator.Element? {
return 99
}
}
struct BSequence: Sequence {
func makeIterator() -> AIterator {
return AIterator()
}
}
// 会一直打印99 不会终止
let bs = BSequence()
for b in bs {
print(b)
}
Tips:
-
associatedtype
这个东西一般用于协议里面使用泛型的时候使用,所谓的泛型就是任意类型。 -
typealias
定义一个类型。