
SwiftUIでリスト内のアイテムの順番を変更できるようにしたいときに便利なのが .move() です。
リスト表示の中で「ドラッグ&ドロップで並び替える」ような動作を直感的に実装するために用意されたメソッドで、Listビューと組み合わせて使うのが一般的です。
この記事では .move() の基本的な意味や使い方、引数の意味、活用シーン、注意点までをわかりやすく丁寧に解説します。
.move() とは?
.move() は SwiftUI における ForEach や List に使えるメソッドです。
ユーザーが行をドラッグして別の位置に移動したときに、データの並び替え処理を自分で定義するためのトリガーです。
このメソッドを使うことで、ユーザーの操作に応じてデータの順序を動的に変更できるようになります。
UIKitでいうところの tableView(_:moveRowAt:to:) に相当するものです。
具体例:文字列配列を並び替える
以下のサンプルコードは、リスト表示された文字列配列を .move() を使ってドラッグ並び替えできるようにする例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import SwiftUI struct ContentView: View { @State private var items = ["りんご", "みかん", "バナナ", "ぶどう"] var body: some View { NavigationView { List { ForEach(items, id: \.self) { item in Text(item) } .onMove(perform: move) } .navigationTitle("果物の並び替え") } } func move(from source: IndexSet, to destination: Int) { items.move(fromOffsets: source, toOffset: destination) } } |
このコードでは、ユーザーが対象のアイテムをドラッグ&ドロップで移動させることができます。

ユーザーがドラッグするとonMove(perform:) に渡した move 関数が呼ばれ、配列の要素が新しい順番に更新されます。
主要な引数とその意味
.move() に渡すクロージャでは、2つの引数を受け取ります。
| 引数名 | 型 | 意味 |
|---|---|---|
| source | IndexSet | 移動元のインデックス(複数可) |
| destination | Int | 移動先のインデックス位置 |
この2つを元に、配列やリストの要素を新しい順番に入れ替える処理を書く必要があります。
特に IndexSet は、複数の整数インデックスをまとめて扱うための型で、連続したインデックス範囲や複数の離れたインデックスをひとつの集合として保持できます。
そのため、複数の要素を一度に移動させたい場合に便利です。
上記例のように items.move(fromOffsets:toOffset:) を使うと、Swiftが提供する配列拡張の機能を使って安全に順番を変更できます。
move(from:to:) の指定の仕方
リストの並び替え処理を正しく動かすには、前述した2つの引数、 IndexSet と Int を扱って配列操作を行う必要があります。
|
1 2 3 4 |
func move(from source: IndexSet, to destination: Int) { items.move(fromOffsets: source, toOffset: destination) } |
この .move(fromOffsets:toOffset:) は配列に用意されたメソッドで、指定した位置の要素をまとめて別の位置へ挿入する処理を自動で行ってくれます。
これによって、配列を手動で insert/remove する必要がなくなり、可読性・安全性ともに向上します。
.move() の活用シーン
.move() は以下のような場面で活用できます。
- ToDoアプリでタスクの優先順位を並び替える
- お気に入りリストやプレイリストで再生順を編集したいとき
- ユーザーが自由に順番を決められる並びのUI
- リストの要素を保存する前に、順番をユーザー操作で調整させたいとき
従来は EditButton と組み合わせて「編集モード」を有効にするのが一般的でした。
ただ、iOS 15以降では 編集モードを使わなくてもドラッグ操作による並び替えが可能になっています。
.move() を使うときの注意点
便利な .move() ですが、以下の点には注意しましょう。
ForEachにユニークなid:を指定する必要があります(配列がIdentifiableでない場合は.selfを指定).onMove(perform:)はForEach直下で使う必要があります(Listに直接ではない)- 並び替えた順番は保持しておかないと、画面が再描画されたときに元に戻る可能性があります(
@Stateで保持すべき) IndexSetは複数の行を同時に移動する可能性があるため、配列の操作を安全に行う必要があります
また、iOS 15以降では moveDisabled() モディファイアで特定の行だけドラッグ不可にすることもできます。
|
1 2 |
.moveDisabled(condition) |
まとめ
今回は SwiftUI の .move() について詳しく紹介しました。
.move()はリストの並び替え操作を処理するためのメソッドonMove(perform:)でデータ配列の並び替えロジックを記述- 活用シーンはToDo、プレイリスト、並び替え可能なリスト全般
@Stateやmove(fromOffsets:toOffset:)の組み合わせが重要
SwiftUIで動的なリスト順操作をユーザーに許可したい場合は、この .move() をうまく活用しましょう!
直感的なUIを実現できるはずです!
