【问题标题】:swift best way (performance) to search for array element快速搜索数组元素的最佳方式(性能)
【发布时间】:2019-01-12 17:31:18
【问题描述】:

我正在制作一个应用程序,我需要从可以随时更改的数组中获取数据。

例如数组:

posts_data: {
  ["id": 1, "text": "Hello"],
  ["id": 4, "text": "Good morning"],
  ["id": 6, "text": "Test"]
}

假设我需要更改post 1 的文本,但我不知道它的索引。然后过一段时间我需要再次更改它,但帖子可能处于不同的位置。

函数 doSomeThing() :

if let index = posts_data.index(where: { $0.id == 1 }) {
    posts_data[index].text = "NEW TEXT"

    dispatchQueue.global().async {
    // Do something async, then I need to change the text again
    // But I need to search for the index again
    // Because the data source might changed meanwhile

        if let index2 = posts_data.index(where: { $0.id == 1 }) {
            posts_data[index2].text = "AGAIN"
            posts_data[index2].text = "AND AGAIN"
        }
    }

}

这有点过于复杂了。我想出了以下想法:将搜索放在自定义类中,如果通过 id 找到则返回帖子:

class MainViewController : UIViewController {
    ...


    func doSomeThing(){
        if PostsClass.shared.getPost(id: 1) == nil {
           return // Just in case if not found
        }

        PostsClass.shared.getPost(id: 1).text = "NEW TEXT"
        dispatchQueue.global().async {
            // Bla bla

            PostsClass.shared.getPost(id: 1).text = "AGAIN"
            PostsClass.shared.getPost(id: 1).text = "AND AGAIN"

        }
    }
}


class PostsClass {
    static let shared = PostsClass()
    func getPost(id: Int) -> Post? {
        if let index = posts_data.index(where: { $0.id == id }) {
            return posts_data[index]
        }
        return nil
    }
}

这是更好还是坏主意?或者还有比这更简单的方法吗?

【问题讨论】:

  • 不清楚,post_data(Post)的Element类型是引用类型还是值类型?你的尝试取决于它。另外,Swift 数组或字典不是线程安全的,当您从多个线程访问单个数组(或字典)时,您可能需要某种排除控制。

标签: arrays swift search


【解决方案1】:

基本上,如果您尝试在数组中搜索是正确的。 但是,您可以使用不同的方法直接返回帖子:

return posts_data.first { $0.id == id }

【讨论】:

    【解决方案2】:

    first 有一个更有效的方法

    class PostsClass {
        static let shared = PostsClass()
        func getPost(id: Int) -> Post? {
            return posts_data.first{ $0.id == id }
        }
    }
    

    请,这是 Swift,将数组命名为 postsData 或简称为 posts

    【讨论】:

      【解决方案3】:

      认为您可能正在寻找这样的东西:

      var posts_data: [[String: Any]]  = [
          ["id": 1, "text": "Hello"],
          ["id": 4, "text": "Good morning"],
          ["id": 6, "text": "Test"]
      ]
      
      var filtered_posts_data: [[String: Any]]   = []
      
      override func viewDidLoad() {
      
          filtered_posts_data = posts_data.filter({$0.contains(where: { (arg) -> Bool in
              if let valueString = arg.value as? String{
                  return valueString.range(of: "hello", options: .caseInsensitive) != nil
              }else{
                  return false
              }
          })})
      
          print(filtered_posts_data) //[["id": 1, "text": "Hello"]]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 2012-05-18
        相关资源
        最近更新 更多