2015-06-14 20 views
11

Ho una matrice contenente un numero di stringhe. Ho usato (vedi sotto) per verificare se esiste una certa stringa nell'array, ma vorrei verificare se una parte di una stringa è nell'array?Controlla se la matrice contiene parte di una stringa in Swift?

itemsArray = ["Google, Goodbye, Go, Hello"] 

searchToSearch = "go" 

if contains(itemsArray, stringToSearch) { 
    NSLog("Term Exists") 
} 
else { 
    NSLog("Can't find term") 
} 

Il codice di cui sopra controlla semplicemente se un valore è presente all'interno della matrice nella sua interezza però mi piacerebbe trovare "Google, Google and Go"

risposta

14

Prova in questo modo.

let itemsArray = ["Google", "Goodbye", "Go", "Hello"] 
let searchToSearch = "go" 

let filteredStrings = itemsArray.filter({(item: String) -> Bool in 

    var stringMatch = item.lowercaseString.rangeOfString(searchToSearch.lowercaseString) 
    return stringMatch != nil ? true : false 
}) 

filteredStrings conterrà l'elenco delle stringhe con stringhe sub abbinate.

In Swift Array struct fornisce un metodo di filtro, che filtra una matrice fornita in base ai criteri di filtro del testo.

+0

lo ha fatto risolto il problema? – Amit89

+0

Grazie per quello. Come potrei verificare esplicitamente se l'array avesse qualcosa in esso come risultato della ricerca? –

+0

Se ho capito bene la tua domanda, puoi usare count per controllare se c'è qualcosa nell'array di risultati filteredStrings. Usa questo - filteredStrings.count – Amit89

16

Prima di tutto, è stato definito un array con una singola stringa. Ciò che probabilmente quello che volete è

let itemsArray = ["Google", "Goodbye", "Go", "Hello"] 

quindi è possibile utilizzare contains(array, predicate) e rangeOfString() - a scelta con .CaseInsensitiveSearch - per verificare ogni stringa nella matrice se contiene la stringa di ricerca:

let itemExists = contains(itemsArray) { 
    $0.rangeOfString(searchToSearch, options: .CaseInsensitiveSearch) != nil 
} 

println(itemExists) // true 

Oppure, se si desidera un array con gli elementi corrispondenti invece di un risultato sì/no :

let matchingTerms = filter(itemsArray) { 
    $0.rangeOfString(searchToSearch, options: .CaseInsensitiveSearch) != nil 
} 

println(matchingTerms) // [Google, Goodbye, Go] 

Aggiornamento per Swift 3:

let itemExists = itemsArray.contains(where: { 
    $0.range(of: searchToSearch, options: .caseInsensitive) != nil 
}) 
print(itemExists) 

let matchingTerms = itemsArray.filter({ 
    $0.range(of: searchToSearch, options: .caseInsensitive) != nil 
}) 
print(matchingTerms) 
+0

perché il 'contains' ha un' throw'? Non è vero o falso? – Honey

+0

@Honey: puoi passare una chiusura di lancio al metodo contains(). Se la chiusura genera un errore, viene ripubblicato da contiene(). - Confronta https://stackoverflow.com/questions/43305051/what-are-the-differences-between-throws-and-rethrows-in-swift. –

8

Prova in questo modo.

Swift 3,0

import UIKit 

let itemsArray = ["Google", "Goodbye", "Go", "Hello"] 

var filterdItemsArray = [String]() 


func filterContentForSearchText(searchText: String) { 
    filterdItemsArray = itemsArray.filter { item in 
     return item.lowercased().contains(searchText.lowercased()) 
    } 
} 

filterContentForSearchText(searchText: "Go") 
print(filterdItemsArray) 

uscita

["Google", "Goodbye", "Go"] 
+0

Si prega di non pubblicare la [stessa risposta] (http://stackoverflow.com/a/40399381/2227743) più volte. Se una domanda ha già una risposta esistente altrove, allora * contrassegna la domanda come duplicata * invece di rispondere di nuovo. Grazie. – Moritz

+0

Hey grazie @Eric Aya Lo farò. –