2017-12-21 3 views
0

Ich möchte meine Ergebnisse besser in meiner Suchleiste filtern.Suche nach mehreren Wörtern filtern, iOS, Swift

Ich habe meine Array enthält:

[["object": "Ball", "color": "Red"], ["object": "Ball", "color": "Blue"], ["object": "Square", "color": "Red"]] 

Wenn ich Ball-Suche alle Kugeln erscheinen, aber wenn ich hinzufügen Red (Ball Red) dann das Quadrat zeigt auch, ich will es nur ein Objekt zu zeigen, das enthält beide Wörter Ball und Rot, nicht alle, die nur eines der Wörter Ball oder Rot enthalten. Kann das gemacht werden?

Unten ist mein Code.

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


     let splitText = searchText.split(separator: " ") 
     filteredVehicles = posts.filter { 
      if let s = $0["object"] as? String, splitText.index(of: Substring(s)) != nil { 
       return true 
      } 
      if let s = $0["color"] as? String, splitText.index(of: Substring(s)) != nil { 
       return true 
      } 
      return false 
     } 
} 
+0

Ihre zwei 'if', tun ein" wenn a und b ", nicht zu aufeinander folgenden, wenn keine Beziehung. – Larme

+0

versuche dieses objects.filter {($ 0 ["object"]?. Enthält ("Square") ?? false) && ($ 0 ["color"]? Enthält ("Red") ?? false)} – adarshaU

Antwort

1

Mit diesem können Sie auch eine Suche mit umgekehrter Reihenfolge erreichen ("Blue Ball "->" Ball Blau ").

let splitText = searchText.split(separator: " ") 
let filteredObjects = objects.filter { 
    var include = false 

    for text in splitText { 
     if let s = $0["object"], text.contains(s) { 
      include = true 
      continue 
     } 

     if let s = $0["color"], text.contains(s) { 
      include = true 
      continue 
     } 

     return false 
    } 

    return include 
} 
+0

Vielen Dank für Ihre Zeit auf diesem @ Oxthor. Das funktionierte perfekt für mich, ich musste es leicht ändern, indem ich als? String '$ 0 [" Farbe "] als? String', damit es funktioniert. Nochmals vielen Dank dafür. Alles Gute –

0

1. Aktualisieren Sie Ihre Filterbedingung wie diese

let filter = dict.filter { 

var isPassed = false 

let split = searchText.components(separatedBy: .whitespaces) 

if split.count > 1 { 

    if ($0["object"]!.contains(split[0]) && $0["color"]!.contains(split[1])) || ($0["object"]!.contains(split[1]) && $0["color"]!.contains(split[0])) { 
     isPassed = true 
    } 
} else { 

    if $0["object"]!.contains(split[0]) || $0["color"]!.contains(split[0]) { 
     isPassed = true 
    } 
} 
return isPassed 
} 
0

Ändern Sie den Code zu folgenden

let splitText = searchText.split(separator: " ") 
filteredVehicles = posts.filter { 

    if splitText.count > 1 { 
     return ($0["color"]?.contains(splitText[0]))! && ($0["object"]?.contains(splitText[1]))! 
    } else if splitText.count == 1 { 
     return ($0["object"]?.contains(splitText[0]))! 
    } 
    return false 
} 
+0

Danke Für deine Zeit auf dieser war ich in der Lage, dies mit Oxthors Antwort zu arbeiten, aber noch einmal vielen Dank für Ihre Zeit –