使用迭代器协议的斐波那契序列
Swift中的迭代器协议是任何序列的for-in循环背后的驱动力。 确认序列协议的任何类型(例如数组)都应提供自己的迭代器。
因此,斐波那契数列的实现看起来像这样
类别FibonacciSequence:Sequence {
func makeIterator()-> FibonacciIterator {
FibonacciIterator()
}
}
迭代器跟踪其迭代过程,并在序列中前进时一次返回一个元素。 迭代器必须实现next()
函数,该函数返回序列的下一个元素。
struct FibonacciIterator:IteratorProtocol {
var(firstNumber,secondNumber)=(0,1)
变异func next()->整数? {
(firstNumber,secondNumber)=
(secondNumber,firstNumber + secondNumber)
返回firstNumber
}
}
next()函数计算斐波那契数列中的下一步或下一数字。
现在我们可以在for-in循环中使用FibonacciSequence
让fibonacciSequence = FibonacciSequence()。prefix(5)
用于fibonacciSequence {
打印(数量)
}
//打印1 1 2 3 5
注意,FibonacciIterator是无限迭代器,没有终止条件。 可以使用条件(例如序列的最大长度)或任何其他终止条件来终止序列。
例如,我们可以使用以下代码生成最多50个斐波那契数
let fibonacciSequence = FibonacciSequence()。prefix {$ 0 <50}
如果要实现迭代器,并希望在迭代器级别控制序列的终止,请添加终止条件
struct FibonacciIterator:IteratorProtocol {
var(firstNumber,secondNumber)=(0,1)
var maxLength:Int = 0
var currentLength:Int = 0
初始化(maxLength:Int){
self.maxLength = maxLength
}
变异func next()->整数? {
保护电流currentLength <maxLength else {
返回零
}
(firstNumber,secondNumber)=
(secondNumber,firstNumber + secondNumber)
currentLength + = 1
返回firstNumber
}
}
在FibonacciIterator以上,它将在其初始化程序中使用最大数量,并在达到最大迭代次数后返回nil。
let fibonacciSequence = AnySequence {FibonacciIterator(maxLength:6)}
用于fibonacciSequence {
打印(数量)
}
//打印1,1,2,3,5,8
在迭代器协议的帮助下实现自定义序列非常有用,尤其是当我们要实现延迟加载时。