🪶

SwiftでforEachを使う

に公開

使い所

forEachは配列の各要素に対して指定した操作を実行するのに適しており、今回は新しい配列を生成する必要がないため、mapよりも適切な選択です。普段使わないので試してみる。

var arr: [Int] = [1, 2, 3, 4, 5]

arr.forEach({
    if $0 == 5 {
        print("要素数は同じ5です")
    } else {
        print("要素数は \($0)")
    }
})

[log]

要素数は 1
要素数は 2
要素数は 3
要素数は 4
要素数は同じ5です

カレンダーを作るのにも使える。1~31の要素を生成して、ループして工夫するとカレンダーぽくなります。

let days = Array(1...31) // 1から31までの配列を生成

// 曜日のヘッダーを出力
print("Sun\tMon\tTue\tWed\tThu\tFri\tSat")

// 1日が水曜日から始まると仮定(例として)
// 最初の2つのタブを追加して、水曜日から開始する
print("\t\t", terminator: "")

// forEachを使用して各日付を出力
days.forEach { day in
    print("\(day)\t", terminator: "") // 各日付の後にタブを追加
    if (day + 2) % 7 == 0 { // 1日が水曜日から始まるため、オフセットとして2を加える
        print() // 週の終わりに改行を追加
    }
}

[log]

Sun	Mon	Tue	Wed	Thu	Fri	Sat
		1	2	3	4	5	
6	7	8	9	10	11	12	
13	14	15	16	17	18	19	
20	21	22	23	24	25	26	
27	28	29	30	31	

私が普段書いているDartでも同じことができるようだ。新しいListを生成しないなら使い道がありそうだな。Swiftの方が簡潔に書けている気がするな...

import 'dart:io';

void main() {
  List<int> days = List.generate(31, (index) => index + 1); // 1から31までのリストを生成

  // 曜日のヘッダーを出力
  print("Sun\tMon\tTue\tWed\tThu\tFri\tSat");

  // 1日が水曜日から始まると仮定(例として)
  // 最初の2つのタブを追加して、水曜日から開始する
  stdout.write("\t\t"); // Dartではprintの代わりにstdout.writeを使用して改行を避ける

  // forEachを使用して各日付を出力
  days.forEach((day) {
    stdout.write("$day\t"); // 各日付の後にタブを追加
    if ((day + 2) % 7 == 0) { // 1日が水曜日から始まるため、オフセットとして2を加える
      print(""); // 週の終わりに改行を追加
    }
  });
}

まとめ

新しい配列を生成する必要がなければ、mapを使わずに、forEachを使うべき。カレンダーのUIを作るときに、試していましたね。

Discussion