每天学一点Swift----闭包(三)
来源:互联网 发布:linux openssl安装 编辑:程序博客网 时间:2024/06/11 01:03
八.捕获上下文中的变量和常量
1. 闭包可以用访问或修改闭包所在上下文中的变量或常量(对于常量只是访问),这个过程被称为捕获。
2. 即使定义这些变量或常量的作用域已经不存在了,闭包也依然可以访问或修改他们。
3. Swift中最简单的闭包形式就是嵌套函数,嵌套函数可以捕获它所在的封闭韩式的变量、常量或参数。举个栗子:
//定义一个函数,该函数返回值的类型为 () -> [String]
func makeArray(ele : String) -> () -> [String]
{
var arr : [String] = []
func addEle() -> [String]
{
arr.append(ele)
return arr
}
return addEle
}
上面的函数makeArray中的嵌套函数addEle()函数没有定义任何参数,也没有定义任何变量,但该嵌套函数可以访问arr变量和ele形参。这是因为嵌套函数捕获了其所在上下文中但变量。
****---- 很容易理解,主要是看makeArray()函数中的变量的作用域的范围。
4. 每个闭包都会持有一个它捕获的变量的副本,为了证明,我们只需打印一下即可:
let result1 = makeArray(ele:"Swift")
print(result1()) ----注意这里一定要用result1加()的方式入参数,不然打印的是关键字Function
print(result1()) ----注意这里一定要用result1加()的方式入参数,不然打印的是关键字Function,并且只打印一个。
//结果是:
[swift]
[swift, swift]
let result2 = makeArray(ele:"bibao")
print(result2()) //输出: [bibao]
print(result2()) //输出: [bibao,bibao]
九.闭包是引用类型
1. 上面的例子中,result1, result2都是常量,但这些常量所引用的闭包依然可以改变它们底层持有的arr副本,这是因为函数和闭包都是引用类型。
2. 当把一个函数或者闭包赋值给一个变量或常量时,程序并未真正使用该变量或常量来存储这个函数或闭包,程序只是让该变量引用了被赋值的函数或闭包,所以该变量成为了引用类型的。----也就是说,当程序把一个闭包赋值给两个引用变量时,程序并不会复制它们,而是让两个引用变量都指向同一个闭包。例如在上面的例子中再添加以下代码:
let result3 = result2
print(result3) //输出 [bibao,bibao,bibao]
print(result3) //输出 [bibao,bibao,bibao,bibao]
以上就是闭包的基本的内容。
上一篇:每天学一点Swift----闭包(二)
下一篇:每天学一点Swift----面向对象上(一)
- 每天学一点Swift----闭包(三)
- 每天学一点Swift----闭包(一)
- 每天学一点Swift----闭包(二)
- 每天学一点Swift----面向对象上(三)
- 每天学一点Swift----面向对象下(三)
- 每天学一点Swift——前言
- 每天学一点Swift----可选类型
- 每天学一点Swift----字符和字符串
- 每天学一点Swift----流程控制
- 每天学一点Swift----集合(一)
- 每天学一点Swift----集合(二)
- 每天学一点Swift----函数(一)
- 每天学一点Swift----函数(二)
- 每天学一点Swift----泛型(一)
- 每天学一点Swift----泛型(二)
- 每天学一点Swift---- 运算符函数
- 每天学一点linux(三)
- 每天学一点Swift----元组(tuple)类型
- make工程管理器
- POJ
- 输入一个链表的头结点,从尾到头反过来打印每个结点的值
- 刘轩-心理课堂-如何谈符合现代价值观的恋爱
- R语言多重线性回归错误分析:Error in model.frame.default
- 每天学一点Swift----闭包(三)
- Kotlin编程开发Android运用程序(Volley+Gson依赖库)
- 每天一个 Linux 命令(35):ln 命令
- 刘轩-婚姻中必须知道的十件事
- 【算法】排序 (二):冒泡排序&快速排序&归并排序&基数排序&拓扑排序(C++实现)
- 关于fedora的一些配置
- 哈夫曼树的创建
- maven 整合spring+springmvc+hibernate
- hdu2147巴什博论