как отфильтровать nsdictionary с несколькими ключами в swift?

#swift

#swift

Вопрос:

 {
    address = "street1";
    country = India;
    state = uttarpradesh;
}
{
    address = "street2";
    country = US;
    state = New York;
}
  

это мой словарь

Я использую панель поиска для фильтра

 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

     // Put your key in predicate that is "Name"


    let filteredArray = MyDict.filter { ($0["address"] as! String).range(of: searchText!,  ($0["country"] as! String).range(of: searchText!, ($0["state"] as! String).range(of: searchText!, options: [.diacriticInsensitive, .caseInsensitive]) != nil }

    print ("array = (filteredArray)")

    if(filteredArray.count == 0){
        searchActive = false;
    } else {
        searchActive = true;
    }
    self.TableView.reloadData()
}
  

Комментарии:

1. Я никогда раньше не видел подобного словаря Swift.

2. Есть ли причина, по которой вы не хотите использовать словарь Swift? Кроме того, избегайте именования вашего var, начинающегося с верхнего регистра. И вы можете, должны сделать «или»: if let inFactAnArray = MyDict as? [[String: String]] { let filteredArray = inFactAnArray.filter{ $0["address"].range(of...) || $0["country"].range(of:)... || ... } } И MyDict на самом деле является массивом словарей. Неправильное именование вводит в заблуждение.

Ответ №1:

Вместо этого

 let filteredArray = MyDict.filter { ($0["address"] as! String).range(of: searchText!,  ($0["country"] as! String).range(of: searchText!, ($0["state"] as! String).range(of: searchText!, options: [.diacriticInsensitive, .caseInsensitive]) != nil }
  

Используется amp;amp; для требования, чтобы два выражения bool были true, или || для создания выражения, которое является true, если любое из них является true.

Итак, чтобы проверить, есть ли текст в адресе или ( || ) округе, используйте

 let filteredArray = MyDict.filter { 
   ($0["address"] as! String).range(of: searchText!) != nil ||  
   ($0["country"] as! String).range(of: searchText!) != nil 
}
  

Вы можете добавить больше проверок с большим || количеством вложенных выражений

Однако из словаря, который вы показали, мне не ясно, что Country — это строка. Вам нужно будет преобразовать что бы это ни было в название страны в виде строки.

Комментарии:

1. Значение типа кортежа ‘(key: Any, value: Any)’ не имеет элемента ‘subscript’, в нем отображается ошибка

Ответ №2:

Предполагается, что в вашем примере MyDict это массив NSDictionary :

 let filteredArray = MyDict.filter {
    for key in $0.allKeys {
        if let string = $0[key] as? String,
            string.contains(searchText) {
            return true 
        }
    }
    return false
}
searchActive = filteredArray.count > 0
  

Кроме того, вам может оказаться очень полезным ознакомиться с основами руководств по Swift