swift版本:
Apple Swift version 2.1 (swiftlang-700.1.101.6 clang-700.1.76)
Target: x86_64-apple-darwin14.5.0
Array类的filter方法用于筛选,其定义是:filter(includeElement: (T) -> Bool) -> T[]
传入的参数是一个闭包。当你在调用filter的时候,实际上是通过传入的这个includeElement去访问了Array内部的变量,并做相应的处理。
先看一个简单的例子。
var strTest:[String] = [String]()
for i in 0..<1000000 {
strTest.append("A\(i)")
}
print(strTest.filter({$0 == "A50"})[0]) //A50
$0代表传入的元素本身,而不是下标。返回的是一个数组,所以取具体值时需要给下标。上面这段代码看上去很无聊,都已经知道结果了,还筛选个毛线啊。那换一段。
var strTest:[(Int, String)] = [(Int, String)]()
for i in 0..<1000000 {
strTest.append((i, "A\(i)"))
}
print(strTest.filter({$0.0 == 250})[0].1) //A250
$0.0代表传入的元组的第一个值,如果元组被命名过了,则可以直接带名字。
filter实际上也是在做循环遍历,把断点打到filter这句话上,断点会反复中断。
下面比较一下效率。
let before = Int64(NSDate().timeIntervalSince1970*1000)
let target = strTest.filter({$0.0 == 250})[0].1
print(target)
print(Int64(NSDate().timeIntervalSince1970*1000) - before) //582
let before = Int64(NSDate().timeIntervalSince1970*1000)
var target:String = ""
for i in 0..<1000000 {
if strTest[i].0 == 250 {
target = strTest[i].1
}
}
print(target)
print(Int64(NSDate().timeIntervalSince1970*1000) - before) //133
所以,今天你花了几分钟时间,学会了一种炫酷难读执行效率低的技术╮(╯▽╰)╭
网友评论