使用Playground快速练习Swift语法--闭包和枚举

闭包

定义:闭包是自包含的函数代码块,可以在代码中被传递和使用。

闭包表达式语法

{ (parameters) -> returnType in 
   statements
}

Swift闭包使用{}包含,in语句前面定义好传入函数的参数个数,类型和返回值,
in语句后面编写实际函数体内容。

闭包使用例子

let names = ["张三","李四","王五"]
var reversed = names.sort({ (s1: String,s2: String) -> Bool in
  return s1 > s2
})
print(reversed)

闭包类型自动推断

Swift中可以根据上下文自动推断闭包的参数和返回值,Swift2.0中return都可以省略。

reversed = names.sort( { s1,s2 in s1 > s2 } )
print(reversed)

还有更简化的,使用参数名缩写,Swift中使用$0,$1代表第一和第二个参数

reversed = names.sort( { $0 > $1 } )
print(reversed)

是不是已经很简化了,Swift还有更变态的,利用运算符函数

reversed = names.sort(>)
print(reversed)

String类型实现大于号(>)的运算符函数,其参数和返回值就是与我们sort函数要求的一致,
所以可以直接传入运算符函数。

有点类似于C++中的运算符重载

尾随闭包

为了增加代码的可读性,我们可以使用闭包的另一种写法,即尾随闭包:

reversed = names.sort() { $0 > $1 } 
print(reversed)

使用尾随闭包时,闭包必须是函数的最后一个参数。
如果函数只需要一个闭包作为参数,我们还可以省略()

reversed = names.sort{ $0 > $1 } 
print(reversed)

Swift官方的一个尾随闭包例子

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 = .东

Switch语句使用枚举

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开发者

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...