//
// Test2.swift
// TestDemo
//
// Created by admin on 2024/7/9.
//
/*
迭代器行为协议实现 IteratorProtocol 的类型提供了一个方法来按需生成序列中的下一个值。它通常与 Sequence 协议一起使用,以定义可以被迭代的集合或序列。
返回序列中的下一个元素。如果没有更多元素可返回,则返回 nil
protocol IteratorProtocol {
associatedtype Element
mutating func next() -> Element?
}
*/
import Foundation
struct ReverseArrayIterator<T>:IteratorProtocol{
private var array:[T]
private var currentIndex:Int
init(array: [T], currentIndex: Int) {
self.array = array
self.currentIndex = currentIndex
}
//协议要实现函数
mutating func next() -> T? {
if currentIndex < 0{
return nil
}else {
let element = array[currentIndex]
currentIndex -= 1
return element
}
}
}
/*
Sequence 是 Swift 中定义可以被迭代的集合或序列的协议。任何符合 Sequence 协议的类型都可以使用 for-in 循环进行迭代。Sequence 提供了许多有用的方法和属性来操作和访问序列中的元素。
Sequence 协议
Sequence 协议的核心是一个方法:makeIterator(),它返回一个遵循 IteratorProtocol 的迭代器
*/
struct ReverseArraySequeue<T>:Sequence{
private var array:[T]
init(array: [T]) {
self.array = array
}
//协议要实现函数
func makeIterator() -> ReverseArrayIterator<T> {
return ReverseArrayIterator(array: array, currentIndex: array.count - 1)
}
}
//
func test21(){
//使用迭代器
let array = [1,23,4,5,5,6,7,8,9,10,11]
var iterator = ReverseArrayIterator(array: array, currentIndex: array.count - 1)
while let ele = iterator.next(){
print(ele)
}
//使用自定义序列
var sequeue = ReverseArraySequeue(array: array)
for e in sequeue{
print(e)
}
}