Swift之过滤器(filter)

Swift提供了很多方便的函数来操作数组,比如 filter,map,reduce,flatMap 等.今天我们了解一下 filter ,顾名思义就是用来过滤的,这是 Swift 为每个数组提供的一个新式武器,filter用于选择数组元素中满足某种条件的元素。

假设有一个数组,接着想要创建一个新的数组,新数组包含原数组中所有大于20的元素,我们可以使用下面的for循环:
let array = Array(5...25)
var anotherArray = [Int]()

for i in array{
    if i > 20{
       anotherArray.append(i)
    }
}
print(anotherArray) //[21, 22, 23, 24, 25]
上面已经实现功能了,但是我们可以使用更简单的方式,那就是 filter函数, 可以大大缩减相关的代码量,如下:
let secondArray = array.filter { (i: Int) -> Bool in
    return i > 20  //注意:根据需求在闭包内进行相应的操作。
}
print(secondArray) //[21, 22, 23, 24, 25]
代码 对比之前还是简单了一些:该函数带一个闭包做为参数,这个闭包将数组中的元素作为参数,并返回一个 bool结果。数组中的每一个元素都会执行该闭包,根据返回的结果来决定是否应存在于新的数组中。

通过Swift 提供的闭包简化写法,我们可以进一步精简:
let thirdArray = array.filter ({$0 > 20})
print(thirdArray) // [21, 22, 23, 24, 25]

接下来看 filter 对数组中字典过滤的例子。需求是:过滤出包含需要的字符部分!
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
   
}
print(searchResults)
//[["First": "JohnMusk", "Last": "Doe"], ["First": "Elon", "Last": "Musk"]]

对于上面过滤部分,我们也可以进行如下:
let searchResult = people.filter{
   
    var found = false
    let searText = "Musk"
    for str in $0.values {
        found = str.lowercaseString.rangeOfString(searText.lowercaseString) != nil
        if found {
            break
        }
    }
    return found
}
print(searchResult)
//[["First": "JohnMusk", "Last": "Doe"], ["First": "Elon", "Last": "Musk"]]
当然,我们也可以使用谓词进行过滤操作
let firstNameQuery = "jo"
let lastNameQuery = "mus"

let predicate = NSPredicate(format: "%K CONTAINS[cd] %@ OR %K CONTAINS[cd] %@", "First", firstNameQuery, "Last", lastNameQuery)
let sorted = people.filter({
    return predicate.evaluateWithObject($0)
})
print(sorted)
//[["First": "JohnMusk", "Last": "Doe"], ["First": "Elon", "Last": "Musk"]]


你可能感兴趣的:(Swift之过滤器(filter))