使用迭代器协议的斐波那契序列

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

在迭代器协议的帮助下实现自定义序列非常有用,尤其是当我们要实现延​​迟加载时。