web-dev-qa-db-ja.com

「like」条件を含む文字列のフィルター配列

メイン配列が["Hello","Bye","Halo"]で、"lo"を検索している場合、配列は["Hello", "Halo"]のみにフィルターされます。

これは私が試したものです:

 let matchingTerms = filter(catalogNames) {
        $0.rangeOfString(self.txtField.text!, options: .CaseInsensitiveSearch) !=  nil
    }

投げる

Type of expression is ambiguous without more context

助言がありますか?

23
Roi Mulia

代わりにcontainsを使用します。

let arr = ["Hello","Bye","Halo"]
let filtered = arr.filter { $0.contains("lo") }
print(filtered)

出力

["Hello"、 "Halo"]

@ user3441734には、もちろんimport Foundation

68
luk2302

In Swift 3.0

let terms = ["Hello","Bye","Halo"]

var filterdTerms = [String]()


func filterContentForSearchText(searchText: String) {
    filterdTerms = terms.filter { term in
        return term.lowercased().contains(searchText.lowercased())
    }
}


filterContentForSearchText(searchText: "Lo")
print(filterdTerms)

Output

["Hello", "Halo"]
27
Ashok R

Swift 3.1

let catalogNames = [ "Hats", "Coats", "Trousers" ]
let searchCatalogName = "Hats"

let filteredCatalogNames = catalogNames.filter { catalogName in 
    return catalogName.localizedCaseInsensitiveContains(searchCatalogName)
}

print(filteredCatalogNames)
6
Roshna D'souza

私の試み...

let brands = ["Apple", "FB", "Google", "Microsoft", "Amazon"]

let b = brands.filter{(x) -> Bool in 
(x.lowercased().range(of: "A".lowercased()) != nil)
}
print(b) //["Apple", "Amazon"]
3
米米米

NSNotFoundと比較する必要もあります。 rangeOfString:options:のドキュメントには次のように書かれています。

マスクのオプションを法として、aStringの最初の出現のレシーバーでの位置と長さを与えるNSRange構造。 aStringが見つからないか空(@ "")の場合、{NSNotFound、0}を返します。

import Foundation

let catalogNames = [ "Hats", "Coats", "Trousers" ]

let matchingTerms = catalogNames.filter {
  $0.rangeOfString(self.txtField.text!, options: .CaseInsensitiveSearch).location != NSNotFound
}
2
Oliver Atkinson

string拡張機能の助けを借りて、純粋なSwiftソリューション(Import Foundationなし)を使用できます。

extension String {
    func contains(string: String)->Bool {
        guard !self.isEmpty else {
            return false
        }
        var s = self.characters.map{ $0 }
        let c = string.characters.map{ $0 }
        repeat {
            if s.startsWith(c){
                return true
            } else {
                s.removeFirst()
            }
        } while s.count > c.count - 1
        return false
    }
}

let arr = ["Hello","Bye","Halo"]
let filtered = arr.filter { $0.contains("lo") }

print(filtered) // ["Hello", "Halo"]

"a".contains("alphabet") // false
"alphabet".contains("")  // true
2
user3441734