gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:13:07 28 4
gpt4 key购买 nike

所以我明白以下代码有效:

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
}
}
}
}
我不明白的是 removeRows(at offsets: IndexSet) .onDelete() 的自定义函数处理程序作品。具体来说,为什么会有一个参数标签 at之前 offsets: .你能用 on吗?而不是 at例如?参数标签只是为了让我们更好地理解代码吗?
然后是 IndexSet我认为我理解为一种类型,它包含用于索引目的的 Int 或用于删除列表中行的 Int 范围,以便 swiftui 知道要删除哪一行?
我想我明白 numbers.remove(atOffsets: offsets)用于实际删除 offsets 处的列表行(就被删除的实际行索引而言) - 但我不确定如何 offsets居然被 swift 知道?究竟是什么 offsets它的值(value)是如何设定的?
我正在尝试通过关注 this 来学习.我仍然对 swiftui 有非常基本的了解,所以请像我在这方面 super 菜鸟一样解释一下。

最佳答案

如果你看 onDelete签名:

@inlinable public func onDelete(perform action: ((IndexSet) -> Void)?) -> some DynamicViewContent
你可以看到它需要一个 ((IndexSet) -> Void)? 类型的参数.
这意味着它需要一个接受 IndexSet 的函数参数并返回 Void .
您的 removeRows函数根据需要具有完全相同的类型:
func removeRows(at offsets: IndexSet) { ...
*以上签名相当于:
func removeRows(at offsets: IndexSet) -> Void { ...

标签 at用于清晰。它可以被称为 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指定要删除的索引。当您在 List 中的一行中向左滑动时它调用 onDelete函数传递 IndexSet 中的行索引范围。
请注意 numbers.remove(atOffsets: offsets)预计 IndexSet atOffsets 的参数标签(并且您不能更改此标签)但您可以根据需要自由命名参数:
func removeRows(at indexSetToDelete: IndexSet) {
numbers.remove(atOffsets: indexSetToDelete)
}

关于swift - onDelete() 函数处理程序如何在 swiftUI 列表中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62741650/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com