本身這個(gè)問題并不難锦积,主要是支持enqueue和dequeue方法。網(wǎng)上有很多例子瞬捕,這里不贅述鞍历。
為了支持for in 循環(huán),一般還會(huì)實(shí)現(xiàn)Sequence協(xié)議肪虎。
網(wǎng)上個(gè)別例子可能在swift 4就會(huì)有錯(cuò)誤堰燎。
因?yàn)橥瑫r(shí)實(shí)現(xiàn)了Collection之類的協(xié)議,導(dǎo)致隱藏了對(duì)Sequence實(shí)現(xiàn)的問題笋轨。
當(dāng)for in 的集合元素為0個(gè)時(shí)會(huì)發(fā)生索引超界異常秆剪。
是makeIterator,不是generate
如果是在一個(gè)純凈的環(huán)境實(shí)現(xiàn)了Sequence 爵政,寫成generate馬上就編譯報(bào)錯(cuò)了仅讽,但是如果同時(shí)跟Collection之類的協(xié)議有關(guān)系,因?yàn)镃ollection繼承自Sequence钾挟,會(huì)導(dǎo)致問題被隱藏起來了洁灵。
//擴(kuò)展隊(duì)列的for...in循環(huán)功能
extension Cat008_Queue: Sequence {
// 從序列中返回一個(gè)迭代器
//public func generate() -> AnyIterator<T> { //這個(gè)方法無效并不存在于 Sequence
public func makeIterator() -> AnyIterator<T> {
return AnyIterator(IndexingIterator(_elements: data.lazy))
}
}
隊(duì)列實(shí)現(xiàn)的簡(jiǎn)單基本功能代碼
// 定義一個(gè)隊(duì)列結(jié)構(gòu)
public struct Cat008_Queue<T> {
// 數(shù)組用來存儲(chǔ)數(shù)據(jù)元素
private var data = [T]()
// 構(gòu)造方法,用于構(gòu)建一個(gè)空的隊(duì)列
public init() {}
// 將類型為T的數(shù)據(jù)元素添加到隊(duì)列的末尾
public mutating func enqueue(element: T) {
data.append(element)
}
// 移除并返回隊(duì)列中第一個(gè)元素
// 如果隊(duì)列不為空掺出,則返回隊(duì)列中第一個(gè)類型為T的元素徽千;否則,返回nil汤锨。
public mutating func dequeue() -> T? {
return data.removeFirst()
}
// 清空隊(duì)列中的數(shù)據(jù)元素
public mutating func clear() {
data.removeAll()
}
}
//擴(kuò)展隊(duì)列的for...in循環(huán)功能
extension Cat008_Queue: Sequence {
// 從序列中返回一個(gè)迭代器
//public func generate() -> AnyIterator<T> { //這個(gè)方法無效并不存在于 Sequence
public func makeIterator() -> AnyIterator<T> {
return AnyIterator(IndexingIterator(_elements: data.lazy))
}
}
測(cè)試方法
func runTest() {
var k = Cat008_Queue<Int>()
k.enqueue(element: 2)
k.enqueue(element: 5)
for item in k {
print(item)
}
//在受到extension了其他collcetion類干擾的情況下双抽,
//對(duì)Sequence的擴(kuò)展中寫的方法名是generate(),則在
//for循環(huán)的集合元素個(gè)數(shù)=0時(shí)會(huì)崩潰闲礼,下標(biāo)超界
var mm = Cat008_Queue<Int>()
for item in mm {
print(item)
}
print("end \(type(of:self)) test")
}