Это будет действительно быстрое руководство, потому что SwiftUI делает удаление элемента списка очень простым.

Шаг 1. Создайте источник данных

Обновите свой ContentView, чтобы он выглядел так:

struct ContentView: View {
    @State var listItems = ["Item 1", "Item 2", "Item 3"]
    
    var body: some View {
        Text("Hello World")
    }
}

Теперь у нас есть источник данных. Поскольку у него есть оболочка свойств State, список будет обновляться, когда произойдут изменения в listItems.

Шаг 2. Добавьте представление списка

Замените представление Hello World Text следующим:

List {
    ForEach(listItems, id: \.self) { (item) in
        Text(item)
    }
}

Теперь вы можете запустить приложение и увидеть элементы в списке.

Шаг 3. Добавьте метод onDelete

Обновите список, чтобы он выглядел так:

List {
    ForEach(listItems, id: \.self) { (item) in
        Text(item)
    }.onDelete { (indexSet) in
        self.listItems.remove(atOffsets: indexSet)
    }
}

Все, что мы сделали, это добавили onDelete к каждому элементу в нашем списке. onDelete принимает в качестве аргумента IndexSet. Мы можем использовать аргумент indexSet, чтобы удалить правильный элемент из нашего массива listItems.

Чтобы удалить его из listItems, мы вызываем метод remove на listItems и проходим через indexSet.

Шаг 4: очистка

Это не требуется, потому что закрытие, которое мы используем для onDelete, невелико, но если бы у нас была другая логика при удалении, было бы лучше, чтобы это было в отдельном методе.

Создайте новый метод с именем deleteItem под свойством body:

private func deleteItem(at indexSet: IndexSet) {
    self.listItems.remove(atOffsets: indexSet)
}

Теперь мы можем вызвать метод deleteItem из onDelete. Для этого обновите onDelete, который мы добавили ранее, чтобы он выглядел так:

.onDelete(perform: self.deleteItem)

Вот и все, если вы создадите и запустите приложение, вы сможете удалять элементы из представления List.

Окончательный исходный код

struct ContentView: View {
    @State var listItems = ["Item 1", "Item 2", "Item 3"]
    
    var body: some View {
        List {
            ForEach(listItems, id: \.self) { (item) in
                Text(item)
            }.onDelete(perform: self.deleteItem)
        }
    }
    
    private func deleteItem(at indexSet: IndexSet) {
        self.listItems.remove(atOffsets: indexSet)
    }
}

Первоначально опубликовано на https://programmingwithswift.com 25 августа 2019 г.