雨燕:永无止境的彩虹

使用IteratorProtocol和Sequence协议创建UIColors序列

Github上的资源和游乐场

Swift IteratorProtocolSequence是两个功能非常强大的协议,它们允许开发人员遍历一系列值。

IteratorProtocol提供序列中的下一个值。 如果下一个值为nil,则序列将停止迭代。 它还可能包含有关迭代的状态信息。

顺序:“一种通常用于遍历for-in循环的类型”。 〜苹果。

如果您使用了Collectionfor-in循环,那么您会遇到这两个协议。 但是,这些协议可以应用于集合以外的事物。

这让我开始思考:

我们还可以迭代其他一些非收集序列吗?

我想到了几个例子,最后我尝试创建一个迭代器,该迭代器生成了永无止境的UIColors序列(彩虹迭代器)。

IteratorProtocolSequence协议非常简单。 苹果甚至提供了两个自动包装器AnyIterator AnySequence ,以帮助您创建迭代器和序列。

  // Rainbow迭代器和序列 
扩展UIColor {
 静态函数rainbowIterator(...)-> AnyIterator  { 
 返回AnyIterator { 
//做一些数学运算以计算下一种颜色
return ... //按顺序返回下一个UIColor
}
 静态函数RainbowSequence(...)-> AnySequence  { 
 返回AnySequence(rainbowIterator(...)) 
}
}

差不多了! 缺少的(也是最难的)是添加一种算法来查找彩虹序列中的下一个颜色。 幸运的是,Jim Bumgardner(jbum)写了一篇很棒的文章,用javascript制作了令人讨厌的彩虹,它提供了一种算法来遍历一系列颜色。

在实现了“彩虹中的下一种颜色”算法之后,我可以遍历一系列UIColors:

  //相移为10°的UIColors序列 
let phaseShifts:[AnySequence ] = stride(from:120,through:0,by:-10).map {
让相位= $ 0.radians
返回UIColor.rainbowSequence(phase1:0,phase2:phase,phase3:phase * 2,重复:true)
}

本质上,该算法使用正弦波基于很少的输入来计算红色,绿色和蓝色的值。

rainbowIterator方法 可以基于重复标志停止,或者执行程序可以在设置一定的迭代次数后从循环中中断,或者可以永远迭代……🌈

在意识到创建自定义迭代器和序列是多么容易之后,我迫不及待地想出一种日常使用它们的精巧实用的方法!

再次,我欠吉姆·布加纳(Jim Bumgardner)欠债。 没有他的工作,我将无法完成本文。 在javascript中制作令人讨厌的彩虹,是一本不错的书,其中包含有关颜色理论的更多详细信息。

cgoldsby /序列
序列– Swift生成器和序列的集合。 github.com