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
的值类型,对吗?@SuperNoobIndexSet
是一种类型indexSet
in.onDelete(执行:{indexSet in…
是一个值。在Swift中,作为惯例,类型使用大写。是的,当您滑动以删除时,onDelete会自动调用。它会给您一些行集,您可以决定如何处理它。我建议您阅读更多有关Swift的文档。