swift 关于IteratorProtocol 和 Sequence协议的使用

//
// 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)
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值