Swift的学习(Closures(闭包))

学习地址:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

闭包

闭包是具有特定功能的自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在 捕获 过程中涉及到的内存操作。
注意:如果您不熟悉 捕获 (capturing) 这个概念也不用担心,后面会详细对其进行介绍。

1、在Swift函数章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一:

1)全局函数是一个有名字但不会捕获任何值的闭包

2)嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包

3)闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包

2 、闭包的使用例子

在swift 标准库中有一个排序的闭包--》跟object——c里的代码块很类似 ;定义一个字符串数组, 将其排序,
   在定义这个排序方法的时候,有很多不确定因素,比如是整数排序,还是字符串排序,是从大到小,还是从小到大。。这些都是不确定的,当你遇到这种类似的情况,有不确定因素时,可以使用闭包;
闭包的语法

{  (parameters)->return tope in
       statements
}
下面是排序的使用 也说明了的闭包几种使用方式
//需要排序的数组
 let sortArray=["a1","bc","c","def","a2"]

//排序的方法 sorted(by:) 方法的使用需要传入一个闭包Closures
//方式1  定义一个闭包传进去
func backward(_ s1:String,_ s2:String) -> Bool {
    return s1>s2
}
let sortResut0=sortArray.sort(backward)
print(sortResut0)
//方式二  根据当前上下文推断 s1,s2的类型  这里sortArray里的数据是字符串,那 s1,s2也是字符串
let sortResult = sortArray.sort { (s1,s2) -> Bool in
    return s1<s2
}
print(sortResult)

let sortResult2=sortArray.sort { s1,s2 in
    return s1>s2
}
print(sortResult2)
//方式三 速写参数名   如果没有声明参数名称的话,默认的是$0,$1,$2...
let sortResult3=sortArray.sort { $0>$1}
print(sortResult3)
//方式四 运算方式
let sortResult4=sortArray.sort(>)
print(sortResult4)
对一个整数数组进行排序  当前 s1,s2 的类型就成了整数; 闭包的类型根据当前上下文决定
let sortArray2 = [1,2,3,0,-2,-3]
let sortResult6 = sortArray2.sort{(s1,s2)in
     return s1>s2
}
print(sortResult4)

未完 待续

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...