Check if array contains part of a string in Swift?
Solution 1
Try like this.
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
will contain the list of strings having matched sub strings.
In Swift Array
struct provides filter method, which will filter a provided array based on filtering text criteria.
Solution 2
First of all, you have defined an array with a single string. What you probably want is
let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
Then you can use contains(array, predicate)
and rangeOfString()
– optionally with
.CaseInsensitiveSearch
– to check each string in the array
if it contains the search string:
let itemExists = contains(itemsArray) {
$0.rangeOfString(searchToSearch, options: .CaseInsensitiveSearch) != nil
}
println(itemExists) // true
Or, if you want an array with the matching items instead of a yes/no result:
let matchingTerms = filter(itemsArray) {
$0.rangeOfString(searchToSearch, options: .CaseInsensitiveSearch) != nil
}
println(matchingTerms) // [Google, Goodbye, Go]
Update for 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)
Solution 3
Try like this.
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)
Output
["Google", "Goodbye", "Go"]
Solution 4
In Swift 5 with better readability :
let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
let searchString = "Googled"
let result = itemsArray.contains(where: searchString.contains)
print(result) //prints true in the above case.
Solution 5
MARK:- Swift 5, Swift 4
//MARK:- You will find the array when its filter in "filteredStrings" variable you can check it by count if count > 0 its means you have find the results
let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
let searchToSearch = "go"
let filteredStrings = itemsArray.filter({(item: String) -> Bool in
let stringMatch = item.lowercased().range(of: searchToSearch.lowercased())
return stringMatch != nil ? true : false
})
print(filteredStrings)
if (filteredStrings as NSArray).count > 0
{
//Record found
//MARK:- You can also print the result and can do any kind of work with them
}
else
{
//Record Not found
}
Related videos on Youtube
Daniel Bramhall
Designer and developer based in rainy Liverpool.
Updated on September 23, 2020Comments
-
Daniel Bramhall over 3 years
I have an array containing a number of strings. I have used
contains()
(see below) to check if a certain string exists in the array however I would like to check if part of a string is in the array?itemsArray = ["Google, Goodbye, Go, Hello"] searchToSearch = "go" if contains(itemsArray, stringToSearch) { NSLog("Term Exists") } else { NSLog("Can't find term") }
The above code simply checks if a value is present within the array in its entirety however I would like to find
"Google, Google and Go"
-
Daniel Bramhall almost 9 yearsThanks for that. How would I explicitly check if the array had anything in it as a result of the search?
-
Amit89 almost 9 yearsIf i understand your question correctly, you can use count to check wether anything there in the result array filteredStrings. Use this - filteredStrings.count
-
Eric Aya over 7 yearsPlease do not post the same answer multiple times. If a question already has an existing answer elsewhere, then flag the question as duplicate instead of answering again. Thanks.
-
mfaani over 6 yearswhy does the
contains
have athrow
? Isn't it either true or false? -
Martin R over 6 years@Honey: You can pass a throwing closure to the contains() method. If the closure throws an error then it is rethrown by contains(). – Compare stackoverflow.com/questions/43305051/….
-
Hammad Tariq almost 6 yearsIn Swift 4.0 rangeOfString is changed to range(of: "string") and lowercaseString is changed to lowerCased()
-
Shahbaz Saleem over 5 yearsI have problem with filter time using this solution. I have an array of Type [Articles] with 1000+ elements and I have to search in description of that article and the description of each article is 1500+ words. filtering is taking too much time. Around 2-3 seconds.