この記事では、Dartのfor-in文について書いていきます。
サンプル
var fruits = ['オレンジ', 'バナナ', 'モモ', 'スイカ'];
void main(){
for (final object in fruits) {
print(object);
}
}書き方
for(リスト要素の型 変数名 in リスト){
// 繰り返す処理
}よく使うプロパティ
isEmpty / isNotEmpty(空か値があるかの判定)
「データが存在するときだけfor文を実行する」という安全策(ガード節)としてよく使われます。
void main(){
var users = ['アリス', 'ボブ'];
if (users.isNotEmpty) {
for (var user in users) {
print(user);
}
}
else if(users.isEmpty){
for(var user in users){
print("ユーザーがいません。");
}
}
}データを持たない場合、以下のような書き方になります。例はユーザーが入力されなかった場合などです。
void main(){
var users = [];
if (users.isNotEmpty) {
for (var user in users) {
print(user);
}
}
else if(users.isEmpty){
print("ユーザーがいません。");
}
}reversed(逆順)
要素を後ろから順に処理したい場合に使用します。例えば、入手したアイテムを古い順に並び替えたいなどです。
void main(){
var x = [1, 2, 3];
// 3, 2, 1 の順で処理される
for (var num in x.reversed) {
print(num);
}
}インデックス(添字)も一緒に使いたい時
Dartのシンプルなfor-in文(for (var item in list))はインデックスが取れません。インデックスも同時に使いたい場合は、以下の方法(プロパティ・メソッド)をよく使います。
asMap()
Listを「インデックス(キー)とバリュー(値)」のMapに変換するプロパティです。これを使うと、for-inで両方を取り出せます。
void main(){
var fruits = ['バナナ', 'オレンジ', 'スイカ'];
for (var entry in fruits.asMap().entries) {
print('${entry.key}番目は ${entry.value}');
}
// 出力: 0番目は バナナ, 1番目は オレンジ...
}indexed
新しくDart 3.0で追加された方法です。レコード(Record)を使って、インデックスと要素を同時に分解(デストラクト)しながらループ処理ができます。
void main(){
var fruits = ['バナナ', 'オレンジ', 'スイカ'];
for (var (index, fruit) in fruits.indexed) {
print('$index: $fruit');
}
}Map(連想配列)をfor-in文で回すときのプロパティ
Mapをfor-in文で処理する場合は、どの部分をループさせたいかによってプロパティを使い分けます。
| プロパティ | 用途 |
|---|---|
| keys | キー(Key)だけを順番に処理する |
| values | 値(Value)だけを順番に処理する |
| entries | キーと値のペア(MapEntry)を同時に処理する |
void main(){
var tests = {'算数': 90, '英語': 85};
// entriesを使った例
for (var entry in tests.entries) {
print('${entry.key}の点数は ${entry.value}点');
}
}for文との違い
リスト(List)やマップ(Map)などのコレクション/配列に含まれるデータを、最初から最後まで連続して順番に1つずつ取り出して処理したい場合に向いています。カウンタ変数(iなど)の宣言や管理が不要なため、コードが比較的直感的に読みやすくなります。
参考
Google Search
