J'ai un cours comme celui-ci
class FoundItem : NSObject {
var id : String!
var itemName : String!
var itemId : Int!
var foundBy : String!
var timeFound : String!
init(id: String,
itemName: String,
itemId: Int,
foundBy: String,
timeFound: String)
{
self.id = id
self.itemName = itemName
self.itemId = itemId
self.foundBy = foundBy
self.timeFound = timeFound
}
et je le mentionne sur mon
class MapViewVC: UIViewController, MKMapViewDelegate {
var found = [FoundItem]()
var filterItemName : String()
}
Mes FoundItem
sont générés par dans un tableau de dictionnaires de ma classe de FoundItem
à partir d'une requête firebase. J'obtiens ensuite une chaîne de cette itemName
générée à partir d'un autre contrôleur de vue qui est une vue de collection de la fonction didSelection
. Je veux prendre cette chaîne et ensuite filtrer ou rechercher les tableaux avec la chaîne itemName
qui est égale à la chaîne itemName
de ma précédente viewController
. Puis supprimé le tableau de dictionnaires qui ne sont pas égaux à la itemName
. Pas seulement les objets, mais tout le tableau qui contient une paire clé/valeur non égale. J'ai cherché pendant des jours et je suis bloqué pour filtrer un ensemble de dictionnaires créés à partir d'une classe. J'ai regardé et essayé NSPredicates, des boucles for-in, mais tout ce qui finit par se produire est de créer un nouveau tableau ou un bool qui trouve que mes valeurs ou mes clés sont égales. Voici la fonction actuelle que j'ai écrite.
func filterArrayBySearch() {
if self.filterItemName != nil {
dump(found)
let namePredicate = NSPredicate(format: "itemName like %@", "\(filterItemName)")
let nameFilter = found.filter { namePredicate.evaluate(with: $0) }
var crossRefNames = [String: [FoundItem]]()
for nameItemArr in found {
let listName = nameItem.itemName
let key = listName
if crossRefNames.index(forKey: key!) != nil {
crossRefNames[key!]?.append(nameItemArr)
if !("\(key)" == "\(filterItemName!)") {
print("------------- Success have found [[[[[[ \(key!) ]]]]]] and \(filterItemName!) to be equal!!")
// crossRefNames[key!]?.append(nameItemArr)
} else {
print("!! Could not find if \(key!) and \(filterItemName!) are equal !!")
}
} else {
crossRefNames[key!] = [nameItemArr]
}
}
} else {
print("No Data from Search/FilterVC Controller")
}
}
Quelqu'un peut-il aider? Il semble que ce serait une tâche simple de trouver la valeur, puis de filtrer les dictionnaires qui ne sont pas égaux à la chaîne itemName
, mais je continue de frapper un mur. Et me heurter moi-même à des boucles: P essayer différentes choses pour accomplir la même tâche.
Trier le tableau du dictionnaire de la manière suivante
var dict:[[String:AnyObject]] = sortedArray.filter{($0["parentId"] as! String) == "compareId"}
La fonction filter effectue une boucle sur chaque élément d'une collection et renvoie une collection contenant uniquement des éléments satisfaisant une condition d'inclusion.
Nous pouvons obtenir un seul objet à partir de ce tableau de dictionnaire, vous pouvez utiliser le code suivant
var dict = sortedArray.filter{($0["parentId"] as! String) == "compareId"}.first
OR
let dict = sortedArray.filter{ ($0["parentId"] as! String) == "compareId" }.first
Ici, j’utilise CoreData et j’ai un tableau de dictionnaire . Ici, je filtre la clé paymentToInvoice dont la valeur est tableau de facturation, puis key factureToPeople qui contient le dictionnaire de personnes, puis je recherche les prénoms, nom, organisation, clé multiple contenant searchText . J'espère que ça aide S'il vous plaît essayez ceci Merci
var searchDict = dict.filter { (arg0) -> Bool in
let (key, value) = arg0
for paymentInfo in (value as! [PaymentInfo]){
let organization = (Array((value as! [PaymentInfo])[0].paymentToInvoice!)[0] as! InvoiceInfo).invoiceToPeople?.organization
let firstName = (Array((value as! [PaymentInfo])[0].paymentToInvoice!)[0] as! InvoiceInfo).invoiceToPeople?.firstName
let lastName = (Array((value as! [PaymentInfo])[0].paymentToInvoice!)[0] as! InvoiceInfo).invoiceToPeople?.lastName
return organization?.localizedStandardRange(of: searchText) != nil || firstName?.localizedStandardRange(of: searchText) != nil || lastName?.localizedStandardRange(of: searchText) != nil
}
return true
}
Filtre de recherche local utilisant le prédicat dans un tableau d'objets de dictionnaire avec le nom de clé, ce code est également utilisé pour Swift3 et Swift4,4.1.
func updateSearchResults(for searchController:
UISearchController) {
if (searchController.searchBar.text?.characters.count)! > 0 {
guard let searchText = searchController.searchBar.text,
searchText != "" else {
return
}
usersDataFromResponse.removeAll()
let searchPredicate = NSPredicate(format: "userName
CONTAINS[C] %@", searchText)
usersDataFromResponse = (filteredArray as
NSArray).filtered(using: searchPredicate)
print ("array = \(usersDataFromResponse)")
self.listTableView.reloadData()
}
}