タイトルの表現で意図が伝わるかどうか怪しいのですが、要は配列を処理するときに次のインデックスの要素も欲しかったのです。
ということでArrayの拡張を作ってみました。
Swiftのバージョンは5.1です。
定義
Array+extensions.swift
extension Array {
func pair(oneEach: Bool = false) -> [(Element, Element?)] {
var copy: [Element?] = self
copy.append(nil)
return self.enumerated()
.filter { oneEach ? true : $0.offset % 2 == 0 }
.map { ($0.element, copy[$0.offset + 1]) }
}
}
呼び出し側
1要素ずつ処理する
こんな感じで使えます。
(0, 1) -> (1, 2) -> (2, 3) -> ...
で取得できるイメージです。
oneEach=trueの例
let nums = [1, 2, 3, 4, 5]
nums.pair(oneEach: true).forEach { num1, num2 in
print("\(num1) * \(num2 ?? 0) = \(num1 * (num2 ?? 0))")
}
// 1 * 2 = 2
// 2 * 3 = 6
// 3 * 4 = 12
// 4 * 5 = 20
// 5 * 0 = 0
1要素おきに処理する
あるいはこんな感じで使えます。
(0, 1) -> (2, 3) -> (4, 5) -> ...
で取得できます。
oneEach=falseの例
let strs = ["夜神","月","高田","清美","L"]
strs.pair().forEach { str1, str2 in
print(str1 + (str2 ?? ""))
}
// 夜神月
// 高田清美
// L
個人的に欲しかった拡張が作れて満足です🙆♂️