Ios 如何在TableView中检查和删除重复的值?
我在Firebase上有一个数据库和一个tableview。 我有一个摩托车品牌、型号和年份的列表,我想在tableview上检索品牌列表Ios 如何在TableView中检查和删除重复的值?,ios,swift,firebase,uitableview,duplicates,Ios,Swift,Firebase,Uitableview,Duplicates,我在Firebase上有一个数据库和一个tableview。 我有一个摩托车品牌、型号和年份的列表,我想在tableview上检索品牌列表 func appendMarqueAndReloadIfNeeded(_ marque: String) { if self.posts.map({ $0.Marque }).contains(marque) { // Do nothing } else { self.posts.append(Post(MarqueText: mar
func appendMarqueAndReloadIfNeeded(_ marque: String) {
if self.posts.map({ $0.Marque }).contains(marque) {
// Do nothing
} else {
self.posts.append(Post(MarqueText: marque))
self.tableView.reloadData()
}
}
问题是DB有重复的值。有不止一辆来自铃木的摩托车,还有不止一款SV650等车型
如何检查重复的值,将其放入新数组,然后在tableview中检索
这是我的TableViewController文件:
import UIKit
import FirebaseAuth
import FirebaseDatabase
class SelectionMarqueViewController: UITableViewController {
var posts = [Post]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
loadMarques()
}
func loadMarques() {
var ref : DatabaseReference?
ref = Database.database(url: "https://myride-test.firebaseio.com/").reference()
ref?.observe(.childAdded, with: { (snapshot) in
if let dict = snapshot.value as? [String: Any] {
let MarqueText = dict["Marque"] as! String
let post = Post(MarqueText: MarqueText)
self.posts.append(post)
print(self.posts)
self.tableView.reloadData()
}
})
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath)
cell.textLabel?.text = posts[indexPath.row].Marque
return cell
}
}
这是带有Post func的文件:
import Foundation
class Post {
var Marque: String
init(MarqueText: String) {
Marque = MarqueText
}
}
这里是我的Firebase数据库:
实际上,tableview显示了DB中品牌的完整列表,因此,很多时候都是相同的品牌
关于数据库和代码:
“Marque”对应于品牌。您可以实现
Hashable
class Post : Hashable {
var marque: String
init(marqueText: String) {
marque = marqueText
}
// Equatable for contains
static func == (lhs:Post,rhs:Post) -> Bool {
return lhs.marque == rhs.marque
}
// Hashable for Set
var hashValue:Int {
return marque.hashValue
}
}
和使用
if let dict = snapshot.value as? [String: Any] {
let MarqueText = dict["Marque"] as! String
let post = Post(MarqueText: MarqueText)
self.posts.append(post)
self.posts = Array(Set(self.posts))
print(self.posts)
self.tableView.reloadData()
}
或者干脆
let marqueText = dict["Marque"] as! String
if !self.posts.map { $0.marqueText}.contains(marqueText) {
let post = Post(marqueText:marqueText)
self.posts.append(post)
self.tableView.reloadData()
}
如果商品在tableview的数据源中不可用,请检查并追加
func appendMarqueAndReloadIfNeeded(_ marque: String) {
if self.posts.map({ $0.Marque }).contains(marque) {
// Do nothing
} else {
self.posts.append(Post(MarqueText: marque))
self.tableView.reloadData()
}
}
然后将其称为内部观察:
///....
if let dict = snapshot.value as? [String: Any] {
let MarqueText = dict["Marque"] as! String
self.appendMarqueAndReloadIfNeeded(MarqueText)
}
///....
永远不要假设具有相同哈希值的两个项相等。我想实现一个可扩散的协议总是更好的。你永远不应该假设两个具有相同哈希值的项是相等的。为什么??如果你考虑如何哈希检查两个项目是相同的,那就是做一个XOR运算符。但是XOR是可交换的(A^B)=(B^A)。如果两个实例A和B的类型相同,如果A==B,则A.hashValue==B.hashValue。反之亦然:哈希值相等的两个实例不一定彼此相等。可以实现可扩散。这不是swift标准,但可以实现更好的性能。我在这里没有使用xor,加上顺序被保留a-b将始终是a-b而不是b-a,也可以检查这一点,我不是说它不起作用。我只是说在某个时候它可能会发生。我确实经历过<代码>哈希表
在我的两个项目中不足以比较项目。所以,大多数时候是的,但可能不总是。在这两种情况下,我实现了类似于的东西:并且一切都运行得更好。if self.posts.map({$0.Marque})。contains(marques){返回错误无法推断当前上下文中的闭包类型您可以从if语句中提取出来:let marques=self.posts.map({$0.Marque});if marques.contains(marquence){…}