Sequence
是集合類數(shù)據(jù)結(jié)構(gòu)中的一個(gè)基礎(chǔ)協(xié)議。
協(xié)議是個(gè)什么東西?
我們使用一個(gè)比較簡(jiǎn)單的協(xié)議來(lái)舉個(gè)例子:Equatable
協(xié)議。
其定義為:
public protocol Equatable {
public static func ==(lhs: Self, rhs: Self) -> Bool
}
在String
和Int
中我們可以找到,但是并看不到具體實(shí)現(xiàn)筹误。但是我們可以知道 2個(gè)str相等那么就必須str的每個(gè)字母都相同,2個(gè)int相等沒(méi)啥好說(shuō)的癣缅。那么比較2個(gè)字典呢纫事,我們到頭文件里面看,他分別是key和value遵守了這個(gè)協(xié)議所灸。還有其他類型的數(shù)據(jù)結(jié)構(gòu)丽惶,我們也可以遵守這個(gè)協(xié)議,并實(shí)現(xiàn)相應(yīng)的方法爬立。
從此我們可以理解為定義協(xié)議就是為了讓我們更好的用更自然更統(tǒng)一的方式去表達(dá)相近的邏輯钾唬,更好的管理面向?qū)ο缶幊讨斜容^類似邏輯的一種手段(純屬個(gè)人理解,不喜勿噴??)。比如 2==2 抡秆、 [] == [] 奕巍、 小明 == 小明 我們程序中判斷2個(gè)東西是否相同,這個(gè)相同就可以用==
表示儒士,具體怎么相同我們規(guī)定了一個(gè)比較函數(shù)的止,具體比較規(guī)則自己去實(shí)現(xiàn)。
一個(gè)簡(jiǎn)單例子:
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 協(xié)議的要求十分簡(jiǎn)單着撩,你需要做的所有事情就是提供一個(gè)返回迭代器 的makeIterator()
方法诅福。
// 每次產(chǎn)生一個(gè) 99 的迭代器
struct AIterator: IteratorProtocol {
typealias Element = Int
mutating func next() -> AIterator.Element? {
return 99
}
}
struct BSequence: Sequence {
func makeIterator() -> AIterator {
return AIterator()
}
}
// 會(huì)一直打印99 不會(huì)終止
let bs = BSequence()
for b in bs {
print(b)
}
Tips:
-
associatedtype
這個(gè)東西一般用于協(xié)議里面使用泛型的時(shí)候使用,所謂的泛型就是任意類型拖叙。 -
typealias
定義一個(gè)類型氓润。