如何解决如何从我的列表中删除重复项?
我正在使用 SwiftUI 在视图中生成这个动态列表(显示生成列表的一部分):
- 薰衣草
- 柠檬
- 石灰
- 石灰
- 芒果
如何从列表中删除重复项(例如 LIME)?
struct FlavorGroupList: View {
@Observedobject private var viewmodel = Flavorsviewmodel()
var body: some View {
List(viewmodel.flavors) { flavorListing in
vstack(alignment: .leading) {
Text(flavorListing.flavorGroup)
}
}
.onAppear() {
self.viewmodel.fetchData()
}
}
}
这是我的视图模型代码:
class Flavorsviewmodel: ObservableObject {
@Published var flavors = [Flavor]()
private var db = Firestore.firestore()
func fetchData() {
db.collection("flavors").order(by: "flavorGroup").addSnapshotListener { (querySnapshot,error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.flavors = documents.compactMap { (queryDocumentSnapshot) -> Flavor? in
return try? queryDocumentSnapshot.data(as: Flavor.self)
}
}
}
}
这是我的模型代码:
struct Flavor: Identifiable,Codable {
@DocumentID var id: String? = UUID().uuidString
var code: String
var descriptors: [String]
var flavorGroup: String
var keywords: [String]
var legislation: String
var name: String
}
我正在从 Firestore 数据库导入数据。
预先感谢您提供的任何帮助。
解决方法
一种简单的方法是,先将数组 flavors
转换为 Set,然后再将其转换回数组。
class FlavorsViewModel: ObservableObject {
@Published var flavors = [Flavor]()
private var db = Firestore.firestore()
func fetchData() {
db.collection("flavors").order(by: "flavorGroup").addSnapshotListener { (querySnapshot,error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.flavors = documents.compactMap { (queryDocumentSnapshot) -> Flavor? in
return try? queryDocumentSnapshot.data(as: Flavor.self)
}
self.flavors = Array(Set(flavors))//<- This line
}
}
}
请参阅文档以供参考:https://developer.apple.com/documentation/swift/set
,您可以创建一个名为 Flavor
的 unique
空数组,遍历检索到的风味并将它们添加到 unique
数组(如果它不存在使用 contains(where: _)
)
func removeDuplicates() -> [Flavor] {
var unique = [Flavor]()
self.flavors.forEach { flavor in
if !unique.contains(where: {$0.name == flavor.name}) {
unique.append(flavor)
}
}
return unique
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。