Swift之过滤器(filter)
Swift提供了很多⽅便的函数来操作数组,⽐如 filter,map,reduce,flatMap 等.今天我们了解⼀下 filter ,顾名思义就是⽤来过滤的,这是Swift 为每个数组提供的⼀个新式武器,filter⽤于选择数组元素中满⾜某种条件的元素。
假设有⼀个数组,接着想要创建⼀个新的数组,新数组包含原数组中所有⼤于20的元素,我们可以使⽤下⾯的for循环:
let array = 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)
filter过滤对象数组//[["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"]]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。