Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在TableView中检查和删除重复的值?_Ios_Swift_Firebase_Uitableview_Duplicates - Fatal编程技术网

Ios 如何在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

我在Firebase上有一个数据库和一个tableview。 我有一个摩托车品牌、型号和年份的列表,我想在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()
  }
}
问题是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){…}