本文的内容为介绍Swift UI 的 onDelete函数,实际操作中列表的delete删除方式以及梳理整个删除流程。
首先,我们需要知道的是,onDelete()是List提供的一个删除交互方式,它可以让用户通过滑动手势删除某一行对应的元素。
实际的删除代码如下:
func removeRows(at offsets: IndexSet) {
expenses.items.remove(atOffsets: offsets)
}
List {
// 使用 id: \.name
ForEach(expenses.items, id: \.name) { item in
Text(item.name)
}
.onDelete(perform: removeRows)
}
实现的流程为:
1、当用户在ForEach列表上滑动删除某一行时,Swift UI会捕获并识别出用户想要删除的内容,并且会将它的索引(IndexSet)传递给removeRows(at:)函数。
这里我们并没有显式的看到索引(IndexSet),这是因为它是在后台由.onDelete自动处理的。
2、removeRows(at:)函数被调用后,会接收用户想要删除的内容的索引,然后调取remove(atOffsets:)方法从数组中删除对应的项目。
1)首先,removeRows的at也是由后台.onDelete自动处理的,所以没有看到显示的传递。
2)其次是,IndexSet是Swift标准库中的一个类型,用于表示一组索引。它可以包含一个或多个整数值,通常用来标识集合或数组中的索引为止。在删除操作中,IndexSet可能标识需要删除的多个元素的位置。
func removeRows(at offsets: IndexSet) {
3)remove(atOffsets:)是Swift UI提供的一个数组扩展方法,用于从数组中删除多个元素,传入的参数是IndexSet。
所以,假设我们的列表中要删除[2,4]索引的元素,那么首先Swift UI会识别删除的内容索引,并将[2,4]索引传递给.onDelete处理。onDelete会调取remove(atOffsets:)方法,删除对应的索引元素。