2016-08-01 31 views
1

so bin ich Filterung Daten (alle Strings), wollen und folgendes zeigen:Wie füge ich zwei Bereich <Index> zusammen?

  1. die Suchwörter, wo die ersten Buchstaben Ihrer Suche (Beispiel enthalten, wenn ‚Br‘ Suche alle Ich möchte sehen. die Wörter, die mit beginnen 'Br' wie Break, Broke, ...)
  2. Die Suchbegriffe, in denen die Zeichenfolge das Wort enthält (Beispiel. Bei der Suche nach 'Br' zeigt alle Wörter mit 'br' im Wort wie "Grundbrecher").

Ich habe sie beide separat zu arbeiten (siehe let found und let foundMore), aber jetzt möchte ich sie beide verschmelzen (zuerst die Suchwörter zeigt, wo die ersten Buchstaben Ihrer Suche enthält, nach denen in dem Die Zeichenfolge enthält das Wort). Erprobt mit dem Zusatzzeichen, aber es gibt den folgenden Fehler

Binärer Operator '+' kann nicht auf zwei 'Range?'

Operanden
extension SearchResultsController : UISearchResultsUpdating { 
     func updateSearchResultsForSearchController(searchController:  UISearchController) { 
     self.tableView.reloadData() 
     let searchBar = searchController.searchBar 
     let target = searchBar.text! 
     self.filteredData = self.originalData.filter { 
      s in 
      let options = NSStringCompareOptions.AnchoredSearch 
      let found = s.rangeOfString(target, options: options) 

      let optionsMore = NSStringCompareOptions.CaseInsensitiveSearch 
      let foundMore = s.rangeOfString(target, options: optionsMore) 

      let allTogether = found + foundMore 

      return (allTogether != nil) 
     } 
     self.tableView.reloadData() 
    } 
} 

Antwort

3

Bereiche können nicht zusammengefügt werden, da das Ergebnis möglicherweise kein richtiger Bereich ist, wenn sich die beiden Bereiche nicht überschneiden.

Sie müssen dies jedoch nicht hinzufügen, da Sie am Ende den gesamten Bereich mit vergleichen. Das bedeutet, dass Sie die beiden Seiten nil einzeln vergleichen:

return s.rangeOfString(target, options: NSStringCompareOptions.AnchoredSearch) != nil 
    || s.rangeOfString(target, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil 

Kontrolle 1. und 2., sollte so betrachtet werden, nicht eine Mischung aus beiden

Dann sollten Sie filtern zweimal, und fügen Sie die zweite Array erste:

var filtered1 = self.originalData.filter { s in 
    return s.rangeOfString(target, options: NSStringCompareOptions.AnchoredSearch) != nil 
} 
let filtered2 = self.originalData.filter { s in 
    // Exclude results of the first search 
    return s.rangeOfString(target, options: NSStringCompareOptions.AnchoredSearch) == nil 
&& s.rangeOfString(target, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil 
} 
filtered1 += filtered2 
self.filteredData = filtered1 
+0

Hallo, das funktioniert, aber es filtert meine Daten nicht die Art, wie ich es will (überprüfen Sie 1. und 2., sollten sie so angesehen werden, nicht eine Mischung aus beidem). Es ist so, als würde ich es tun wollen.am Ende des ersten Arrays anhängen (wenn das Sinn macht) – SoundShock

+0

@SoundShock Das ist auch machbar - siehe Bearbeiten. – dasblinkenlight

+0

Danke, das ist genau das, was ich wollte! – SoundShock

0

Für Ihren Fall, dass Sie + mit ?? ersetzen können, so dass, wenn eine Reihe nicht-Null ist, wird er als der Wert von allTogether eingestellt werden. Dies ist ein minimaler Code, ist aber nicht unbedingt der offensichtlichste oder leicht zu lesende. Ein expliziter logischer ODER-Null-Test ist offensichtlicher.

+0

Hallo, Das war in der Tat eine Option Ich schon erforscht, aber in diesem Fall ist es nicht meinen Daten, die die Art und Weise filtert ich es haben will (ersten Zeige die Suchbegriffe an, wo die ersten Buchstaben deine Suche enthalten (Beispiel Bei der Suche nach 'Br' möchte ich alle Wörter sehen, die mit 'Br' beginnen wie Break, Broke, ...) Die Suchbegriffe, in denen die Zeichenfolge das Wort enthält (Beispiel. Bei der Suche nach 'Br' werden alle Wörter angezeigt, die enthalten "Br" im Wort wie "Groundbreaker"). – SoundShock

+0

das ist, weil Filterung und Sortierung sind 2 verschiedene Dinge, und Sie müssen zuerst filtern und dann sortieren – Wain

0

Wenn möglich, können Sie dies versuchen:

let indexSet = NSMutableIndexSet() 
indexSet.addIndexesInRange(NSMakeRange(0, 5)) 
indexSet.addIndexesInRange(NSMakeRange(10, 4)) 
indexSet.addIndex(5) 
println(indexSet) 

Dann können Sie Ihre Tätigkeit hier tun:

indexSet.enumerateIndexesUsingBlock { (index, stop) -> Void in 
    println(index) 
}