美文网首页
每天学一点Swift----闭包(三)

每天学一点Swift----闭包(三)

作者: 冯可乐同学 | 来源:发表于2017-05-22 21:51 被阅读22次

八.捕获上下文中的变量和常量

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----闭包(三)

    八.捕获上下文中的变量和常量 1.闭包可以用访问或修改闭包所在上下文中的变量或常量(对于常量只是访问),这个过程被...

  • 每天学一点Swift----闭包(二)

    七.闭包表达式 1.调用闭包(使用闭包返回值):闭包的本质是功能更加灵活的代码块,因此完全可以将闭包赋值给变量(联...

  • 每天学一点Swift----闭包(一)

    五.嵌套函数 1. Swift还支持在函数体内定义函数,这种在函数体内定义的函数称为嵌套函数 2.默认情况下,嵌套...

  • Swift----闭包

    闭包是自包含的函数代码块,可以在代码中被传递和使用. 闭包可以捕获和存储其所在上下文中任意常量和变量的引...

  • 每天学一点Swift----面向对象下(三)

    二.类的构造和析构(续) 1. Swift中,子类不会自动继承父类的构造器,只有满足如下规则时,子类才会自动继承父...

  • 每天学一点Swift----面向对象上(三)

    四.值类型和引用类型 1.前面已经提到过,Swift中的类是引用类型,而枚举、结构体是只类型。 2.对于前面的例子...

  • 每天学一点Swift----函数(一)

    1. Swift中支持嵌套函数。 2.与函数紧密相关的另一个概念是闭包,闭包的本质是匿名函数,闭包可以作为表达式,...

  • 每天学一点Swift----可选类型

    一.可选和nil 1.在任何类型的后面紧跟?即可表示它是可选类型。可选类型的变量可以用来处理“值缺失”的情况。 2...

  • 每天学一点Swift----集合(一)

    1. Swift的集合是一种特别有用的工具。Swift提供了数组和字典两种集合类型来存储集合数据。数组用于按顺序存...

  • 每天学一点Swift----集合(二)

    三.字典:字典中以key-value的形式保存数据,所以同一个字典中key不能重复。 1.声明字典--两种方式 (...

网友评论

      本文标题:每天学一点Swift----闭包(三)

      本文链接:https://www.haomeiwen.com/subject/wvbixxtx.html