Swift过滤多个字典键

我正在为我的应用程序做一个search栏。 我正在使用filter方法来获得结果。 我想通过多个键进行search。

字典数组:

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

我只能search“First”或“Last”,但不能同时使用以下代码:

 searchResults = people.filter{ var string = $0["Last"] // or "First" string = string?.lowercaseString return string!.rangeOfString(searchText.lowercaseString) != nil } 

一种方法是简单地将两个字段与searchstring进行比较:

 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; } ) 

我相信是你想要的。

这是一个使用NSPredicate的替代方法。 NSPredicate有一个非常强大的语法 ,可以为你做一些相当不错的事情。

 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 

在我的例子中,我通过了不同的search查询的名字和姓氏,但你显然可以传递相同的查询。 只是展示了这种方法的力量。

下面的代码应该工作:

 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 }