2015-11-19 9 views
5

Ich mache eine Suchleiste für meine App. Ich verwende die filter Methode, um die Ergebnisse zu erhalten. Ich möchte mehrere Schlüssel durchsuchen.Swift-Filter für mehrere Wörterbuch-Tasten

Array von Wörterbüchern:

var people = [ 
       ["First": "John", "Last": "Doe"], 
       ["First": "Steve", "Last": "Jobs"], 
       ["First": "Elon", "Last": "Musk"] 
      ] 

Ich bin nur in der Lage entweder für "First" oder "Last", aber nicht beide, mit diesem Code zu suchen:

searchResults = people.filter{ 
      var string = $0["Last"] 
      // or "First" 

      string = string?.lowercaseString 

      return string!.rangeOfString(searchText.lowercaseString) != nil 
     } 
+0

Ist das der richtige Code, den Sie verwenden? In der zweiten Zeile des Wörterverzeichnisses fehlt ein '' 'nach' Steve'. – Undo

+0

Das Wörterbuch, das ich benutze, ist sehr groß, also habe ich ein kleines als Beispiel gemacht, aber der Code für die Suche ist was ich lustig. –

Antwort

7

Ein Ansatz wäre einfach beiden Felder zum Suchbegriff vergleichen:

var people = [ 
    ["First": "JohnMusk", "Last": "Doe"], 
    ["First": "Steve", "Last": "Jobs"], 
    ["First": "Elon", "Last": "Musk"] 
] 

var searchText = "Musk" 

var searchResults = people.filter{ 
     var firstName = $0["First"]!.lowercaseString 
     var lastName = $0["Last"]!.lowercaseString 

     return firstName.rangeOfString(searchText.lowercaseString) != nil 
       || lastName.rangeOfString(searchText.lowercaseString) != nil 

} 

das gibt mir dieses Ergebnis:

2015-11-18 18:19:47.691 MyPlayground[36558:7031733] (
     { 
     First = JohnMusk; 
     Last = Doe; 
    }, 
     { 
     First = Elon; 
     Last = Musk; 
    } 
) 

Welche ich glaube, was Sie wollen.

1

Der folgende Code sollte Werke:

var people = [ 
     ["First": "John", "Last": "Doe"], 
     ["First": "Steve", "Last": "Jobs"], 
     ["First": "Elon", "Last": "Musk"] 
     ] 


    let searchResults = people.filter{ 

    var found = false 
    let searText = "Elon" 
    for str in $0.values { 
     found = str.lowercaseString.rangeOfString(searText.lowercaseString) != nil 
     if found { 
      break 
     } 
    } 
    return found 
} 
4

Hier ist ein alternativer Ansatz mit NSPredicate. NSPredicate hat eine sehr leistungsfähige syntax, die einige schöne Dinge für Sie tun kann.

let firstNameQuery = "jo" 
let lastNameQuery = "mus" 
// [cd] means case/diacritic insensitive. %K is used to pass in key names since FIRST and LAST are reserved keywords in NSPredicate 
let predicate = NSPredicate(format: "%K CONTAINS[cd] %@ OR %K CONTAINS[cd] %@", "First", firstNameQuery, "Last", lastNameQuery) 
let sorted = people.filter({ 
    return predicate.evaluateWithObject($0) 
}) 
// sorted would contain John Doe and Elon Musk entries 

In meinem Beispiel ging ich in verschiedenen Suchanfragen für den Vor- und Nachnamen, aber man konnte offensichtlich in der gleichen Abfrage für beide übergeben. Zeigt nur die Stärke dieses Ansatzes.