在Swift中过滤字典数组

Abh*_*k R 4 nsmutablearray uisearchbar nsmutabledictionary nspredicate swift2

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

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

我想根据密钥"名称"过滤这个字典

 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()
 }
Run Code Online (Sandbox Code Playgroud)

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

aya*_*aio 9

我建议使用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()
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • `searchActive =!filteredArray.isEmpty` (2认同)

Mus*_*ari 8

试试这个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()
}
Run Code Online (Sandbox Code Playgroud)