繁体   English   中英

用于多个字典键的Swift过滤器

[英]Swift filter for multiple dictionary keys

我正在为我的应用创建一个搜索栏。 我正在使用filter方法来获得结果。 我想搜索多个键。

字典数组:

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

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

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

            string = string?.lowercaseString

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

一种方法是简单地将两个字段与搜索字符串进行比较:

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

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

以下代码应该有效:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM