Array是我們最常用的集合類了奴愉,Array的遍歷也是很常用的操作痛侍。有沒有想過語言底層是怎樣實(shí)現(xiàn)遍歷這個操作的呢。在OC中我們可以使用for循環(huán)直接用數(shù)組下標(biāo)來訪問壶运,但是在swift中已經(jīng)廢棄了這種方式针饥,而是用for in 來實(shí)現(xiàn)這個操作厂抽。for in這種方式的遍歷是針對SequenceType這個protocol的,Array之所以支持for in就是因?yàn)樗鼘?shí)現(xiàn)了SequenceType這個protocol丁眼。要說SequenceType就離不開GeneratorType這個protocol筷凤,它是SequenceType的基礎(chǔ)。
先看GeneratorType的定義:(swift 3.0已經(jīng)更名為IteratorProtocol)
public protocol IteratorProtocol {
associatedtype Element
public mutating func next() -> Self.Element?
}
這個協(xié)議由一個關(guān)聯(lián)類型Element和一個next方法組成苞七。Element表明這個協(xié)議會生成一個什么類型的值藐守,next方法則是生成這個值的過程。下面我們通過一段代碼說明這個protocol怎么工作莽鸭。
class ReverseIterator:IteratorProtocol{
var element:Int
init<T>(array:[T]) {
self.element = array.count-1
}
func next() ->Int?{
let result:Int? = self.element < 0 ? nil : element
element -= 1
return result
}
}
let arr = ["A","B","C","D","E"]
let itertator = ReverseIterator(array:arr)
while let i = itertator.next(){
print("element \(i) of the array is \(arr[i])")
}
我們定義了一個ReverseIterator類實(shí)現(xiàn)IteratorProtocol協(xié)議吗伤。通過next方法,我們實(shí)現(xiàn)了一個倒序遍歷一個數(shù)組硫眨。創(chuàng)建ReverseIterator對象的時候足淆,需要一個Array做參數(shù),然后我們通過while循環(huán)遍歷數(shù)組礁阁,遍歷的時候循環(huán)獲取ReverseIterator對象的next方法直到返回nil結(jié)束巧号。注意:我們這個例子是通過獲取數(shù)組的下標(biāo)來實(shí)現(xiàn)獲取數(shù)組元素的,也可以直接獲取數(shù)組元素姥闭。