如何枚举每两个元素的集合(如[1、2、3、4](,而不是Swift中的[[1, 2], [3, 4]]
,而是[[1,2], [2, 3], [3, 4]]
。
更喜欢像forEach
这样的方法,但在这个问题中是forEachTwo
:
collections.forEachTwo { (first, second) in
// do something.
}
for (first, second) in zip(elements, elements.dropFirst()) {
print(first, second)
}
forEach
(或导数(在这里不适合迭代。最好使用for-in
。forEach
有副作用(打破FP(和与Swift的微妙怪异(打破好Swift(。for-in
更强大、更清洁。但实际序列的创建是经典的FP:zip和dropFirst。
请注意,这是一个元组序列,而不是您所写的数组。考虑到您建议的语法,我认为您不希望在这里使用数组(尽管如果使用map
,您可以实现这一点(。
你可以用它得到你建议的语法,但它不像for-in
那样灵活,并且有微妙的边缘情况(例如,如果闭包包括return
,它的行为就像continue
(:
extension Sequence {
func forEachTwo(_ f: ((Element, Element) -> Void)) {
for element in zip(self, dropFirst()) {
f(element.0, element.1)
}
}
}