【问题标题】:Filtering array of dictionaries in Swift在 Swift 中过滤字典数组
【发布时间】:2016-04-08 10:01:57
【问题描述】:

我有一个带有字典的数组示例:

(
        {
        Email = "kate-bell@mac.com";
        Name = "Kate Bell";
        Number = "(555) 564-8583";
    },
        {
        Email = "d-higgins@mac.com";
        Name = "Daniel Higgins";
        Number = "555-478-7672";
    }
)

我想根据键“名称”过滤这个字典

 func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    let predicate = NSPredicate(format:"Name == %@", searchText)
    let filteredArray = (arrContact as NSMutableArray).filteredArrayUsingPredicate(predicate)
    print(filteredArray)
    if(filteredArray.count == 0){
                searchActive = false;
            } else {
                searchActive = true;
            }
            tblData.reloadData()
 }

我总是从上面的 swift 代码中得到空数组。请帮我解决这个问题。谢谢

【问题讨论】:

    标签: swift2 nsmutablearray uisearchbar nspredicate nsmutabledictionary


    【解决方案1】:

    我建议改用 Swift 的 filter

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        let filteredArray = arrContact.filter { $0["Name"] == searchText }
        print(filteredArray)
        if filteredArray.isEmpty {
            searchActive = false
        } else {
            searchActive = true
        }
        tblData.reloadData()
    }
    

    正如@LeoDabus 在他的评论中提到的,您甚至可以进一步简化:

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        let filteredArray = arrContact.filter { $0["Name"] == searchText }
        print(filteredArray)
        searchActive = !filteredArray.isEmpty
        tblData.reloadData()
    }
    

    【讨论】:

    • searchActive = !filteredArray.isEmpty
    【解决方案2】:

    为 swift 3 试试这个

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    
        // Put your key in predicate that is "Name"
        let searchPredicate = NSPredicate(format: "Name CONTAINS[C] %@", searchText)
        let array = (arrContact as NSArray).filtered(using: searchPredicate)
    
        print ("array = \(array)")
    
        if(array.count == 0){
            searchActive = false;
        } else {
            searchActive = true;
        }
        self.aTable.reloadData()
    }
    

    【讨论】:

    • @Abhishek Rathore。如果您有任何问题,请告诉我
    • 即使我遇到了同样的问题,这也是一个糟糕的答案,但你的回答拯救了我的一天
    • 不适用于 Swift 4。请为 Swift 4 更新或添加
    【解决方案3】:

    斯威夫特

    从模型类中获取项目/数组列表。

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if self.searchBarItems.text == "" {
            self.arrFilter = self.arrayDictionarySubModel
        } else {
            self.arrFilter.removeAll()
            let filteredArray = self.arrayDictionarySubModel.filter { ($0.itemTitle?.contains(self.searchBarItems.text ?? ""))!}
            print("filtered array:- ", filteredArray[0].itemTitle!)
            self.arrFilter = filteredArray
        }
        self.searchItemTableView.reloadData()
    }
    

    【讨论】:

      【解决方案4】:

      其中“name”是键名

        var namePredicate = NSPredicate(format: "Name like %@",  String(searchText));
              let searchPredicate = NSPredicate(format: "Name CONTAINS[C] %@", searchText)
              arrrDict = self.arrrDict.filter { searchPredicate.evaluate(with: $0) };
             you will get the result in dictionary specialy made to get contats from the phone book
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-29
        • 2018-06-13
        • 2017-03-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        相关资源
        最近更新 更多