Check if array contains part of a string in Swift?

38,659

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
}
Share:
38,659

Related videos on Youtube

Daniel Bramhall
Author by

Daniel Bramhall

Designer and developer based in rainy Liverpool.

Updated on September 23, 2020

Comments

  • Daniel Bramhall
    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
    Daniel Bramhall almost 9 years
    Thanks for that. How would I explicitly check if the array had anything in it as a result of the search?
  • Amit89
    Amit89 almost 9 years
    If 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
    Eric Aya over 7 years
    Please 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
    mfaani over 6 years
    why does the contains have a throw? Isn't it either true or false?
  • Martin R
    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
    Hammad Tariq almost 6 years
    In Swift 4.0 rangeOfString is changed to range(of: "string") and lowercaseString is changed to lowerCased()
  • Shahbaz Saleem
    Shahbaz Saleem over 5 years
    I 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.