swift高阶函数-filter

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

所以,今天你花了几分钟时间,学会了一种炫酷难读执行效率低的技术╮(╯▽╰)╭

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,305评论 4 61
  • (续六) 原著:幽明 据史载,黑还是个工作狂,做了汗王后更是日理万机,对于身边的女人们,自然少了关照的精力。布木布...
    幽明刘旭音阅读 472评论 1 0
  • (一) 她起了个大早,仔细的画了妆。 昂贵的护肤品可以让缓解皮肤的衰老,可是岁月刻在眼睛里的风雨,却是没有一种可以...
    伊南小姐阅读 275评论 2 1
  • 坐在纽约街边的咖啡店的我 最后一天在座城市。也许以后还会有机会再来这这里,因为没有遇到那个让我恋上这座城市的那个人。
    c173162891a1阅读 231评论 0 0
  • 我们工作的目的是什么?今天我在工作群里发起一个提问。 总结起来有三类: 为了生计需要 为了个人成长 为了消磨时光 ...
    春来燕回阅读 5,956评论 1 3