LoginSignup
2
1

More than 3 years have passed since last update.

【Swift】次の要素も一緒に処理したい

Posted at

タイトルの表現で意図が伝わるかどうか怪しいのですが、要は配列を処理するときに次のインデックスの要素も欲しかったのです。
ということで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

個人的に欲しかった拡張が作れて満足です🙆‍♂️

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1