Listの行をスワイプで削除する方法【SwiftUI】

UITableView時代からある、行をスワイプすると削除ボタンが現れるあれです。それをSwiftUIでやってみます。

Listの行をスワイプで削除する方法

スワイプによる削除アクションを実現するには、ForEachonDeleteアクションを使います。

現状、この方法しか(おそらく)無いため、通常、Listを表示するだけであればForEachを使う必要は無いのですが、仕方無いので従いましょう。

struct ContentView: View {
    
    @State private var languages = [
        "C/C++",
        "Java",
        "C#",
        "Ruby",
        "PHP",
        "Objective-C",
        "Swift",
        "Kotlin",
        "Python"
    ]
    
    var body: some View {
        List {
            ForEach(languages, id: \.self) { lang in
                Text(lang)
            }
            .onDelete { (offsets) in
                self.languages.remove(atOffsets: offsets)
            }
        }
    }
}

onDeleteは「(offsets: IndexSet) -> Void」というフォーマットに従ったメソッドを引数として渡す必要があります。

上記ではクロージャを使っていますが、以下のように別メソッドを定義して引数として渡す方法でも問題ありません。

var body: some View {
        List {
            ForEach(languages, id: \.self) { lang in
                Text(lang)
            }
            .onDelete(perform: self.deleteRow)
        }
    }
    
    func deleteRow(offsets: IndexSet) {
        self.languages.remove(atOffsets: offsets)
    }

ちなみに、IndexSet(offsets)から削除した行のインデックスが欲しい場合は以下のようすれば取得出来ます(が良い方法なのかわかりません)。

if let index: Int = offsets.first {
    // index を使って何か処理
}

以上