2015-11-19 7 views
5

私のアプリの検索バーを作っています。私は結果を得るためにfilterメソッドを使用しています。私は複数のキーを検索したい。辞書の複数の辞書キーのスウィフトフィルタ

アレイ:一つのアプローチは次のようになり

searchResults = people.filter{ 
      var string = $0["Last"] 
      // or "First" 

      string = string?.lowercaseString 

      return string!.rangeOfString(searchText.lowercaseString) != nil 
     } 
+0

これは実際のコードですか? – Undo

+0

私が使用している辞書は非常に大きいので、例として小さな辞書を作ったのですが、検索のコードは私のものです使用しています。 –

答えて

7

var people = [ 
       ["First": "John", "Last": "Doe"], 
       ["First": "Steve", "Last": "Jobs"], 
       ["First": "Elon", "Last": "Musk"] 
      ] 

私はこのコードでは、両方だけでなく、「最初」または「最後」のいずれかを検索することですが、単に検索文字列に両方のフィールドを比較する:

var people = [ 
    ["First": "JohnMusk", "Last": "Doe"], 
    ["First": "Steve", "Last": "Jobs"], 
    ["First": "Elon", "Last": "Musk"] 
] 

var searchText = "Musk" 

var searchResults = people.filter{ 
     var firstName = $0["First"]!.lowercaseString 
     var lastName = $0["Last"]!.lowercaseString 

     return firstName.rangeOfString(searchText.lowercaseString) != nil 
       || lastName.rangeOfString(searchText.lowercaseString) != nil 

} 

をこれが私にこの結果を与える:

2015-11-18 18:19:47.691 MyPlayground[36558:7031733] (
     { 
     First = JohnMusk; 
     Last = Doe; 
    }, 
     { 
     First = Elon; 
     Last = Musk; 
    } 
) 

私はあなたが望むものと信じています。

1

以下のコード必要がありますが、動作します。

var people = [ 
     ["First": "John", "Last": "Doe"], 
     ["First": "Steve", "Last": "Jobs"], 
     ["First": "Elon", "Last": "Musk"] 
     ] 


    let searchResults = people.filter{ 

    var found = false 
    let searText = "Elon" 
    for str in $0.values { 
     found = str.lowercaseString.rangeOfString(searText.lowercaseString) != nil 
     if found { 
      break 
     } 
    } 
    return found 
} 
4

ここNSPredicateを使用して別のアプローチがあります。 NSPredicateは非常に強力なsyntaxを持っています。

let firstNameQuery = "jo" 
let lastNameQuery = "mus" 
// [cd] means case/diacritic insensitive. %K is used to pass in key names since FIRST and LAST are reserved keywords in NSPredicate 
let predicate = NSPredicate(format: "%K CONTAINS[cd] %@ OR %K CONTAINS[cd] %@", "First", firstNameQuery, "Last", lastNameQuery) 
let sorted = people.filter({ 
    return predicate.evaluateWithObject($0) 
}) 
// sorted would contain John Doe and Elon Musk entries 

私の例では、姓と名が異なる検索クエリを渡しましたが、明らかに両方のクエリを渡すことができます。このアプローチの力を実証するだけです。

関連する問題