2015-06-14 26 views
11

Mam tablicę zawierającą liczbę ciągów. Użyłem (patrz poniżej), aby sprawdzić, czy dany ciąg w tablicy istnieje jednak chciałbym sprawdzić, czy część łańcucha jest w tablicy?Sprawdź, czy tablica zawiera część ciągu znaków w Swift?

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

searchToSearch = "go" 

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

Powyższy kod po prostu sprawdza, czy wartość jest obecny w tablicy w całości jednak chciałbym znaleźć "Google, Google and Go"

Odpowiedz

14

Spróbuj tak.

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 będzie zawierać listę ciągów o dopasowanych podciągach.

Swift Array struktury zapewnia sposób filtr, który filtruje dostarczonego układ oparty na kryteriach filtrowania tekstowych.

+0

Czy to w rozwiązaniu problemu? – Amit89

+0

Dzięki za to. W jaki sposób mogę jawnie sprawdzić, czy tablica zawierała coś w wyniku wyszukiwania? –

+0

Jeśli dobrze rozumiem twoje pytanie, możesz użyć count, by sprawdzić wszystko w tablicy wyników filtersStrings. Użyj tego - filtersStrings.count – Amit89

16

Przede wszystkim zdefiniowano tablicę z jednym ciągiem. Co prawdopodobnie chcesz to

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

Następnie można użyć contains(array, predicate) i rangeOfString() - opcjonalnie z .CaseInsensitiveSearch - aby sprawdzić każdy ciąg w tablicy jeśli zawiera ciąg wyszukiwania:

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

println(itemExists) // true 

Lub jeśli chcesz tablicę z elementów dopasowania zamiast tak/nie wynik:

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

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

Aktualizacja 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

dlaczego "zawiera" ma "rzut"? Czy to nie jest prawda czy fałsz? – Honey

+0

@ Miód: Możesz przekazać zamknięcie rzucania do metody contains(). Jeśli zamknięcie zgłasza błąd, jest ponownie zgłaszane przez contains(). - Porównaj https://stackoverflow.com/questions/43305051/what-are-the-differences-between-throws-and-rethrows-in-swift. –

8

Spróbuj tak.

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) 

Wyjście

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

Proszę nie umieszczać [tej samej odpowiedzi] (http://stackoverflow.com/a/40399381/2227743) wiele razy. Jeśli pytanie ma już istniejącą odpowiedź w innym miejscu, * oznacz * pytanie jako duplikat * zamiast odpowiadać ponownie. Dzięki. – Moritz

+0

Hej dzięki @Eric Aya Zrobię to. –

Powiązane problemy