SwiftUI makes it easy to let users swipe to delete rows by attaching an onDelete(perform:) handler to some or all of your data.
ContentView.swift// // ContentView.swift // Test // // Created by Cairocoders // import SwiftUI struct ContentView: View { @State private var users = ["Airi Satou", "Angelica Ramos", "Ashton Cox", "Bradley Greer", "Brenden Wagner", "Brielle Williamson"] var body: some View { NavigationView { List { ForEach(users, id: \.self) { user in Text(user) } .onDelete(perform: delete) } } } func delete(at offsets: IndexSet) { users.remove(atOffsets: offsets) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }ContentView.swift
// // ContentView.swift // Test // // Created by Cairocoders // import SwiftUI struct ContentView: View { @State private var newTodo = "" private let todosKey = "todosKey" @State private var allTodos: [TodoItem] = [] var body: some View { NavigationView { VStack { //vertical stack HStack { //Horizontal Stack TextField("Add todo...", text: $newTodo) .textFieldStyle(RoundedBorderTextFieldStyle()) Button(action: { guard !self.newTodo.isEmpty else { return } self.allTodos.append(TodoItem(todo: self.newTodo)) self.newTodo = "" self.saveTodos() }) { Image(systemName: "plus") } .padding(.leading, 5) }.padding() //end horizontal stack List { //List view to display all of the to-dos in our allTodos ForEach(allTodos) { todoItem in Text(todoItem.todo) }.onDelete(perform: deleteTodo) }.onAppear(perform: loadTodos) }//end vertical stack .navigationBarTitle("Todos") } } //Storing To-dos in UserDefaults //UserDefaults is a database where you store key-value //https://developer.apple.com/documentation/foundation/userdefaults private func saveTodos() { UserDefaults.standard.set(try? PropertyListEncoder().encode(self.allTodos), forKey: todosKey) } private func loadTodos() { if let todosData = UserDefaults.standard.value(forKey: todosKey) as? Data { if let todosList = try? PropertyListDecoder().decode(Array<TodoItem>.self, from: todosData) { self.allTodos = todosList } } } private func deleteTodo(at offsets: IndexSet) { self.allTodos.remove(atOffsets: offsets) saveTodos() } } //Add codable to make Sure each item encoded and decoded struct TodoItem: Codable, Identifiable { //Identifiable protocol this ensures that the system can distinguish one TodoItem from another var id = UUID() let todo: String } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }