Filtrar y orderar matriz rápida

Tengo una matriz rápida que quiero filtrar, aquí está la matriz

let array = [apple,workshops,shopping,sports,parties,pantry,pen] 

Quiero filtrar la matriz de tal manera que los elementos que comienzan con la cadena de búsqueda aparezcan antes que los elementos que simplemente contienen la cadena de búsqueda

Entonces, cuando busco por ejemplo p, los resultados deberían ser de alguna manera

 let array = [parties,pantry,pen,apple,workshops,shopping,sports] 

Probé esto

 tagSearchResults = tagSearchResults.filter({ (interestTag:InterestTag) -> Bool in let tmp: NSString = interestTag.tag let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) return range.location != NSNotFound }) 

pero esto me da todas las cadenas que contienen la cadena de búsqueda.

Chicos, ¿cómo puedo hacer esto?

Solo puedes escribir

 let result = words .filter { $0.containsString(keyword) } .sort { ($0.hasPrefix(keyword) ? 0 : 1) < ($1.hasPrefix(keyword) ? 0 : 1) } 

Ejemplo

 let words = ["apple", "workshops", "shopping", "sports", "parties", "pantry", "pen", "cat", "house"] let keyword = "p" let result = words .filter { $0.contains(keyword) } .sorted { ($0.hasPrefix(keyword) ? 0 : 1) < ($1.hasPrefix(keyword) ? 0 : 1) } // ["pen", "pantry", "parties", "apple", "workshops", "shopping", "sports"] 

Prueba esto. En primer lugar, filtra la matriz para eliminar aquellos elementos que no contienen la cadena de búsqueda, luego usa una orderación personalizada para preferir los elementos que comienzan con la cadena de búsqueda. En general, use el enfoque cartesiano de dividir un problema en subproblemas más pequeños, en lugar de tratar de resolverlo todo en un solo paso.

 let searchString = "p" let array = ["apple", "workshops", "shopping", "sports", "parties", "pantry", "pen", "xyzzy"] let filtenetworkingArray = array.filter({ $0.contains(searchString) }) filtenetworkingArray // drops xyzzy let sortedArray = filtenetworkingArray.sorted(isOrdenetworkingBefore: { switch ($0.hasPrefix(searchString), $1.hasPrefix(searchString)) { case (true, true): return $0 < $1 case (true, false): return true case (false, true): return false case (false, false): return $0 < $1 } }) sortedArray // "pantry", "parties", "pen", "apple", "shopping", "sports", "workshops"] as requinetworking 

De otra manera:

 let searchString = "p" let array = ["apple", "workshops", "shopping", "sports", "parties", "pantry", "pen", "xyzzy"] let result = array.filter{$0.containsString(searchString)} .map{($0.hasPrefix(searchString) ? 0 : 1, $0)} .sort{$0 < $1} .map{$1} print(result) //->["pantry", "parties", "pen", "apple", "shopping", "sports", "workshops"] 

(No sé por qué, pero mi Xcode tardó mucho time en comstackr estas líneas. Creo que esto comstack y funciona como se esperaba).