swift 闭包的理解
/**
* 闭包(Closures)
* 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。
*
* 闭包可以捕获和存储其所在上下文中任意常量和变量的引用。这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift 会为您管理在捕获过程中涉及到的所有内存操作。
* (1)在函数章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一:
*
* 全局函数是一个有名字但不会捕获任何值的闭包
* 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
* 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包
*
* (2)Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:
* 利用上下文推断参数和返回值类型
* 隐式返回单表达式闭包,即单表达式闭包可以省略return关键字
* 参数名称缩写
* 尾随(Trailing)闭包语法
*/
/**
* 定义一个字符串的变量方法:
*/
var str = "JobDeer"
var str1: String = {
return "JobDeer"
}()
print(str1)
var str2: String {
return "闭包可以省略等号和括号"
}
/**
* 闭包中可以定义get方法
*/
var str3:String{
get{
return "闭包中可以定义get方法"
}
}
print(str3)
/**
* 闭包中也可以定义set方法
*/
var str4:String {
set{
print("闭包中定义的set方法")
}
get{
return "闭包中定义的get方法"
}
}
print(str4)
/**
* 我们再用 willSet 和didSet方法试一试
* 注意 用 willSet /didSet不能和get/set共同使用的, 在使用willSet /didSet时,变量需要有初始值。 所以这么使用:
*/
var str5:String="Ashimar"{
willSet{
print("newValue:\(newValue)")
}
didSet{
print("oldValue:\(oldValue)")
}
}
str5 = "Winnie"
/**
* 通过上面这个例子, 我们感觉闭包的表达实现形式很多。 下面系统总结一下。
最全的定义形式是 :
{
(arguments) ->returnType in
code
}(arguments)
* 可以在闭包中定义参数,返回值。 闭包后用括号执行,并在括号中可以传参。 例如:
*/
var str6 = {
(arg1:String, arg2:String)->String in
return arg1+arg2
}("Win","nie")
/**
* 基于上面最全的定义方式, 我么可以省略参数的类型:
*/
var str7 = {
arg1,arg2 -> String in
return arg1 + arg2;
}("Win","nie")
/**
* 还不够爽,我们可以把参数也省略了
*/
var str8:String = {
return $0 + $1
}("Win","nie")
var str9:String={
$0+$1;
}("Win","nie")
/**
* 如果闭包没有定义参数:像这样
*/
var str10:String = {
return "Winnie"
}()
var str11:String{
return "Winnie"
}
/**
* 上面这种闭包表现方法似曾相识, 如果你学过swift的类,知道类的属性可以用闭包表示, 可以在闭包中定义 set, get , willSet,didSet等方法。 那么上面变量是否也能这样定义呢?
* 答案是肯定的:
* 可以定义set,get,willSet,didiSet等方法
*/
var str12:String{
get{
return "Winnie"
}
set{
print("set ok")
}
}
var str13:String = "Ashimar"{
willSet{
print("newValue:\(newValue)")
}
didSet{
print("oldValue:\(oldValue)")
}
}
str13 = "new value"