闭包-简洁版(Swift)
来源:互联网 发布:秀萝捏脸数据 编辑:程序博客网 时间:2024/05/17 13:41
转自:http://ju.outofmemory.cn/entry/103446
闭包内容挺多的,一次看多了晕菜,直接来个简洁版的,还有疑惑看其他帖子去
- 闭包(closure)与函数(function)
很多语言都有闭包的概念,比如C中的block,C++的lamda //Global functions, nested functions, and closure 可以认为函数是特殊形式的闭包,也可以认为闭包是匿名函数,二者基本是通用的。
无论函数还是闭包,在引用外部变量时,如果变量是在栈上(比如,局部变量),会将其拷贝到堆上,这也是所有语言中的做法。Global function
var c = 1 func inc() -> Int { return ++c }
Nested function
func makeIncrementor() -> (()->(Int)){ var c = 1 func inc() -> Int { c++ return c } return inc }
Closure
func makeIncrementor(var c:Int) -> (()->(Int)){ var c = 1 return { () -> Int in c++ return c } }
闭包的基本形式
{ (parameters) -> (return type) in statements } let reversed = sort(["Jim", "Kate"], { (s1:String, s2:String) -> Bool in return s1 > s2 })
// 闭包的函数体部分由关键字 in 引入
// 该关键字表示闭包的参数和返回值类型定义已经完成,闭包的函数体即将开始
类型推导
可以由上下文推导传入和传出的参数类型,比如sort的原型是 func sort(array: T[], pred: (T, T) –> Bool) –> T[]
根据第一个String[]就可以知道s1, s2是String类型了,返回值s1>s2自然是Bool类型let reversed2 = sort(["Jim", "Kate"], { s1, s2 in let a = s1.utf16count return s1 > s2 })
如果只有一条语句的话,return可省略,直接将该语句的值返回,但多条语句return不能省略
let reversed3 = sort(["Jim", "Kate"], { s1, s2 in s1 > s2 })
如果不写参数名称,默认是$0, $1,…
let reversed4 = sort(["Jim", "Kate"], { $0 > $1 })
在这里还可以直接使用运算符函数operator function
let reversed5 = sort(["Jim", "Kate"], >)
跟function一样,closure的参数默认为let,可以使用var修改
- closure是reference type
0 0
- 闭包-简洁版(Swift)
- swift闭包简洁到变态
- Swift-闭包
- Swift学习-闭包(七)
- swift学习-闭包
- Swift闭包(Closure)
- Swift 闭包(Closures)
- 【Swift初见】Swift闭包
- swift基本语法(总结提炼版)之012 swift 之闭包
- swift基本语法(总结提炼版)之013 swift 之闭包返回值
- swift基本语法(总结提炼版)之014 swift 之闭包循环引用
- js 闭包说的很简洁
- swift基础笔记2-闭包
- Swift中文教程(七) 闭包
- Swift中的闭包(Closure)
- Swift中文教程(七) 闭包
- swift学习之闭包(closure)
- Swift 闭包(Closure)回调传值
- 链表检测环以及环的入口
- 跨平台(linux/win)启动线程, 并设置线程名称(便于调试)
- C++习题记录-牛客网
- TDD和BDD及DDD的解说
- Swift下拉菜单动画实现
- 闭包-简洁版(Swift)
- 打包Tomcat中的web程序的指令
- Extjs/Ajax中的success和failure 何时调用?
- html5从入门到精通-新增属性
- Apple Watch UI设计基础
- 内存分配不成功导致内存泄漏的问题
- php可变参数实现
- OutMan——Objective-C内存管理
- 多线程和MsgWaitForMultipleObjects