Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
onDelete()函数处理程序在swiftUI列表中如何工作?_Swift_Swiftui - Fatal编程技术网

onDelete()函数处理程序在swiftUI列表中如何工作?

onDelete()函数处理程序在swiftUI列表中如何工作?,swift,swiftui,Swift,Swiftui,因此,我理解以下代码是有效的: struct ContentView: View { func removeRows(at offsets: IndexSet) { numbers.remove(atOffsets: offsets) } @State private var numbers = [Int]() @State private var currentNumber = 1 var body: some View {

因此,我理解以下代码是有效的:

struct ContentView: View {
    func removeRows(at offsets: IndexSet) {
        numbers.remove(atOffsets: offsets)
    }
    
    @State private var numbers = [Int]()
    @State private var currentNumber = 1

    var body: some View {
        VStack {
            List {
                ForEach(numbers, id: \.self) {
                    Text("\($0)")
                }
                .onDelete(perform: removeRows)
            }

            Button("Add Number") {
                self.numbers.append(self.currentNumber)
                self.currentNumber += 1
            }
        }
    }
}
我不明白的是
removows(在偏移量处:IndexSet)
用于
.onDelete()
的自定义函数处理程序是如何工作的。具体来说,为什么在偏移量之前的处有一个参数标签。例如,您是否可以在上使用
,而不是在
上使用
?参数标签只是为了让我们更好地理解代码吗

还有
IndexSet
,我想我理解为一种类型,它保存一个Int用于索引目的,或者保存一个Int范围用于删除列表中的一行,以便swiftui知道要删除哪一行

我想我理解
数字。remove(atOffsets:offsets)
用于实际删除
offsets
处的列表行(就实际删除的行索引而言)-但我不确定swift实际如何知道
offsets
?实际上什么是偏移量,它的值是如何设置的


我试着通过跟随来学习。我对swiftui仍有非常基本的了解,所以请解释一下,就好像我是超级noob一样。

如果你看一下
onDelete
签名:

@inlinable public func onDelete(perform action: ((IndexSet) -> Void)?) -> some DynamicViewContent
您可以看到,它需要类型为
((IndexSet)->Void)
的参数

这意味着它需要一个接受
IndexSet
参数并返回
Void
的函数

您的
removows
函数具有与所需类型完全相同的类型:

func removeRows(at offsets: IndexSet) { ...
*上述签名等同于:

func removeRows(at offsets: IndexSet) -> Void { ...

标签
位于
用于清晰。它也可以被称为
someCustomLabel

func removeRows(someCustomLabel offsets: IndexSet) { ...
但你需要这样称呼它:

removeRows(someCustomLabel: indexSet)
您也可以完全跳过标签:

func removeRows(offsets: IndexSet) { ...
然后像这样调用函数:

removeRows(offsets: indexSet)
请注意:

.onDelete(perform: removeRows)
同:

.onDelete(perform: { indexSet in
    self.removeRows(at: indexSet)
})

IndexSet
指定要删除的索引。当您在
列表中的一行上向左滑动时
将调用
onDelete
函数,在
IndexSet
参数中传递行索引

请注意,
numbers.remove(atOffsets:offset)
需要
atOffsets
标签的
IndexSet
参数(并且您不能更改此标签),但您可以随意命名参数:

func removeRows(at indexSetToDelete: IndexSet) {
    numbers.remove(atOffsets: indexSetToDelete)
}

见Thank you@pawello2222,所以我意识到这回答了我关于参数标签的问题。我假设swift.org文档意味着我们可以使用任何单词作为参数标签,而不是
at
?(我发现swift.org上的解释不够明确,我无法完全理解)。对于我的其他问题,我仍然不知所措。谢谢@pawello2222,这很有帮助。为了清楚起见,当您提到
indexSet
时,您的意思是键入
indexSet
?此外,这是否意味着当用户在行上向左滑动以调用
onDelete
函数时,Swift会自动将该行索引发送到IndexSet参数(
offsets
)。这是不是
onDelete
函数自动完成的事情,而无需我担心?还需要确认的是,
IndexSet
是参数
offsets
的值类型,对吗?@SuperNoob
IndexSet
是一种类型
indexSet
in
.onDelete(执行:{indexSet in…
是一个值。在Swift中,作为惯例,类型使用大写。是的,当您滑动以删除时,onDelete会自动调用。它会给您一些行集,您可以决定如何处理它。我建议您阅读更多有关Swift的文档。