gpt4 book ai didi

ios - Swift - 使用 IndexSet 获取数组项

转载 作者:行者123 更新时间:2023-12-01 21:54:43 24 4
gpt4 key购买 nike

我有我的联系对象:

struct Contact: Codable, Identifiable {
var id: Int = 0
var name: String
var lastName: String
var phoneNumber: String
}
在我看来,我有一个将从服务器获取的联系人列表。
List {
ForEach(viewModel.contacts) { contact in
ContactView(contact: contact)
}
.onDelete(perform: self.viewModel.delete)
}
当我删除一个联系人时,我会调用我的 viewModel 方法 delete,它只会从数组中删除该项目。但由于我将向服务器发出删除联系人的请求,因此我想获取有关我要删除的项目的信息,例如 Id。
class ContactsViewModel: ObservableObject {
@Published contacts = [
Contact(id: 1, name: "Name 1", lastName: "Last Name 1", phoneNumber: "613456789"),
Contact(id: 2, name: "Name 2", lastName: "Last Name 2", phoneNumber: "623456789"),
Contact(id: 3, name: "Name 3", lastName: "Last Name 3", phoneNumber: "633456789"),
Contact(id: 4, name: "Name 4", lastName: "Last Name 4", phoneNumber: "643456789")
]
func delete(at offsets: IndexSet) {
self.contacts.remove(atOffsets: offsets)
}
}
我想知道我是否可以做这样的事情:
func delete(at offsets: IndexSet) {
// Get the contact from array using the IndexSet
let itemToDelete = self.contacts.get(at: offsets)

deleteRequest(itemToDelete.id){ success in
if success {
self.contacts.remove(atOffsets: offsets)
}
}
}

最佳答案

考虑到前面提到的deleteRequest语义上是异步的,一般来说,一个用户操作中可能会删除多个联系人,我会像下面这样做

func delete(at offsets: IndexSet) {

// preserve all ids to be deleted to avoid indices confusing
let idsToDelete = offsets.map { self.contacts[$0].id }

// schedule remote delete for selected ids
_ = idsToDelete.compactMap { [weak self] id in
self?.deleteRequest(id){ success in
if success {
DispatchQueue.main.async {
// update on main queue
self?.contacts.removeAll { $0.id == id }
}
}
}
}
}

注意:在 UI 中还需要一些反馈来标记进展的联系人并禁止用户对其进行其他操作,直到相应的 deleteRequest 结束。

关于ios - Swift - 使用 IndexSet 获取数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61347408/

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