雨燕:永无止境的彩虹
使用IteratorProtocol和Sequence协议创建UIColors序列
Github上的资源和游乐场
Swift IteratorProtocol和Sequence是两个功能非常强大的协议,它们允许开发人员遍历一系列值。
IteratorProtocol提供序列中的下一个值。 如果下一个值为nil,则序列将停止迭代。 它还可能包含有关迭代的状态信息。
顺序:“一种通常用于遍历for-in循环的类型”。 〜苹果。
如果您使用了Collection或for-in循环,那么您会遇到这两个协议。 但是,这些协议可以应用于集合以外的事物。
这让我开始思考:
我们还可以迭代其他一些非收集序列吗?
我想到了几个例子,最后我尝试创建一个迭代器,该迭代器生成了永无止境的UIColors序列(彩虹迭代器)。
IteratorProtocol和Sequence协议非常简单。 苹果甚至提供了两个自动包装器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
- 在for语句中使用String.CharacterView.Index.successor()
- 有效地将Swift Array复制到iOS Metal的内存缓冲区
- Swift 3:URLSession / URLRequest不起作用
- 我怎样才能在NSDictionary内张贴一个NSDray的NSArray没有问题?
- 什么约束会阻止我的UIView堆叠在一起呢?
- iOS自定义UIImagePickerController相机裁剪到正方形
- 将NSOperationinheritance到Internet操作并重试
- 带内容视图的UIScrollView
- Xcode:Swift – 如何根据执行环境声明具有不同值的变量/常量?