Swift3.0学习笔记-Closures
来源:互联网 发布:美剧 知乎 编辑:程序博客网 时间:2024/05/03 12:01
https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94
闭包是个代码块, 跟函数很像, 是Swift特有的一个语法。 苹果介绍了它的概念,包含3种形式:
1、全局函数是个有名称的闭包, 不使用任何作用域内的参数;
2、嵌套函数是个有名称的闭包,可以使用外边全局函数的局部变量;
3、匿名表达式即没有函数名称,并可以读取作用域内的变量;
4、闭包内使用self参数时,为了避免相互引用导致内存不回收问题, 要添加 [unowned self] 前缀。
以String的sorted方法为例, 说明闭包的用法(有点像Java的Comparator)
let students = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]func forward(_ s1: String, _ s2: String) -> Bool { return s1 < s2}var reversedNames = students.sorted(by: forward)for tmp1 in reversedNames { print(tmp1)}上边代码式按照从低到高排序, 输出:
AlexBarryChrisDaniellaEwa
闭包表达式的基本定义:
{ (parameters) -> return type in
statements
}
如果闭包里使用self参数, 为了避免相互引用。 要使用 unowned self , 例如:
{ [unowned self] (params) -> return type in
代码
self.....
}
包含参数、返回值、关键字in、代码块、返回值和大括号, 其中代码大括号和代码是必须的、其它是可省略的。
按照上述定义, 重新写sorted方法如下(功能不变):
var reversedNames = students.sorted(by: {(s1: String, s2: String) -> Bool in return s1 < s2})
因为Swift可以通过参数值确定参数类型, 所以可以省略参数类型, 即
var reversedNames = students.sorted(by: {(s1, s2) -> Bool in return s1 < s2})
Swift语言的设计原则是能省则省, 因为闭包表达式总是需要一个返回值。 如果代码块只有一句代码,那么可以省略return关键字。(说明:必须是只有一行代码,才能省略return关键字)
var reversedNames = students.sorted(by: {(s1, s2) -> Bool in s1 < s2})
因为String的sorted方法的参数肯定是(String, String)->Bool类型(有点像C语言的函数指针), 可以省略这些参数。
public func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]
var reversedNames = students.sorted(by: {s1, s2 in s1 < s2})
Swift闭包参数可以是$0,$1,$2......,表示第1个、第2个、第3个等等参数, 即$0可以替换s1、$1可以替换s2。
var reversedNames = students.sorted(by: { $0 < $1})
对于String数组排序, sorted方法就是需要判断大小的true或false, 还可以写成
var reversedNames = students.sorted(by: <)这个写法就很高大上了, 简洁的不能再简洁了。
小结: Swift的设计原则是尽量减少开发者的代码量,让代码更加简洁明了; 闭包必须是基本定义的语法, 其它一切可省略的代码都是基于Swift的其它语法。
0 0
- Swift3.0学习笔记-Closures
- swift学习笔记 --- Closures
- Swift3.0学习笔记-Functions
- Swift3.0学习笔记-Initialization
- Swift3.0学习笔记-DeInitialization
- Swift3.0学习笔记-Extensions
- Swift3.0学习笔记-Protocols
- Swift3.0学习笔记-Generics
- Swift3.0 URLSession学习笔记
- Swift3.0 URLSession学习笔记
- Swift3.0学习笔记-Extensions
- swift 学习笔记二:Closures
- 【Swift3.1】闭包(Closures)
- Swift3.0学习笔记(一)
- Swift3.0学习笔记----遍历字符串
- Swift3.0学习笔记-String and Characters
- Swift3.0学习笔记-Collection Types
- Swift3.0学习笔记-Control Flow
- ParMetis 网格分割笔记
- LeetCode-292-Nim Game
- Spring Cloud构建微服务架构(二)服务消费者
- 开始SpringCloud
- BFS的辅助队列最小安全长度
- Swift3.0学习笔记-Closures
- Python基础9迭代
- 33. Search in Rotated Sorted Array
- POJ 3617 Best Cow Line 贪心
- android4.4从系统图库无法加载图片的问题
- 一起来写ftp server 02 -- 一次失败的尝试
- usaco The Tamworth Two 两只塔姆沃斯牛
- Spring Cloud构建微服务架构(三)断路器
- C++特性之多态