定义:闭包是自包含的函数代码块,能够在代码中被传递和使用。html
{ (parameters) -> returnType in statements }
Swift闭包使用{}包含,in语句前面定义好传入函数的参数个数,类型和返回值,
in语句后面编写实际函数体内容。ios
let names = ["张三", "李四", "王五"] var reversed = names.sort({ (s1: String, s2: String) -> Bool in return s1 > s2 }) print(reversed)
Swift中能够根据上下文自动推断闭包的参数和返回值, Swift2.0中return均可以省略。git
reversed = names.sort( { s1, s2 in s1 > s2 } ) print(reversed)
还有更简化的,使用参数名缩写,Swift中使用$0,$1表明第一和第二个参数编程
reversed = names.sort( { $0 > $1 } ) print(reversed)
是否是已经很简化了,Swift还有更变态的,利用运算符函数swift
reversed = names.sort(>) print(reversed)
String类型实现大于号(>)的运算符函数,其参数和返回值就是与咱们sort函数要求的一致,
因此能够直接传入运算符函数。微信
有点相似于C++中的运算符重载闭包
为了增长代码的可读性,咱们可使用闭包的另外一种写法,即尾随闭包:app
reversed = names.sort() { $0 > $1 } print(reversed)
使用尾随闭包时,闭包必须是函数的最后一个参数。
若是函数只须要一个闭包做为参数,咱们还能够省略()函数
reversed = names.sort{ $0 > $1 } print(reversed)
Swift官方的一个尾随闭包例子ui
let digitNames = [ 0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine" ] let numbers = [16, 58, 510] let strings = numbers.map { (var number) -> String in var output = "" while number > 0 { output = digitNames[number % 10]! + output number /= 10 } return output } print(strings)
注意: 字典digitNames下标后跟着一个叹号 (!),由于字典下标返回一个可选值 (optional value),使用叹号 (!)会强制解析字典中的值,若是给一个不存在的下标(好比11),该语句就会出错。
enum 方向 { case 东 case 南 case 西 case 北 } var directionToHead = 方向.北 //或 directionToHead = .东
direction = .南 switch direction { case .东: print("龙为东方之神") case .南: print("朱雀为南方之神") case .西: print("白虎为西方之神") case .北: print("玄武为北方之神") }
实际编程中尽可能仍是不要用中文做为枚举名吧 :)
Swift中的枚举的确强大,历来没见过其余语言枚举还有设置相关值的
enum Barcode { case UPCA(Int, Int, Int) case QRCode(String) } var productBarcode = Barcode.UPCA(8, 85909_51226, 3) productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
UPCA类型须要3个Int值建立,QRCode类型须要一个String类型建立
枚举初始化的时候能够给每一个枚举值设置一个默认值,默认值必须具备相同的类型
如下定义一个默认值为Character
enum ASCIIControlCharacter: Character { case Tab = "\t" case LineFeed = "\n" case CarriageReturn = "\r" }
若是使用整数做为默认值时,指定第一个后,后续的会自动递增
enum Planet: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune } let earthsOrder = Planet.Earth.rawValue let possiblePlanet = Planet(rawValue: 7)
使用枚举的rawValue属性获取默认值;
经过参数为rawValue构造函数建立特定默认值的枚举。
The Swift Programming Language 中文版
The Swift Programming Language 2.0 官方教程
本文做者: 阳春面
原文地址:http://www.aswifter.com/2015/07/20/learn-swift-with-playground-closure...
欢迎关注个人微信公众号,分享Android 开发,IOS开发,Swift开发和互联网内容
微信号:APP开发者