Swift之闭包

Swift之闭包,第1张

概述swift中闭包是一个很强大的东西,闭包是自包含的函数代码块,可以在代码中被传递和使用。跟C 和 Objective-C 中的代码块(blocks)很相似 。这个大家必须掌握!必须掌握!必须掌握!重要的事情要说三遍 闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。下面我们就来攻克它! 1、闭包函数 官方在讲解闭包函数的时候一般都是使用一个s

swift中闭包是一个很强大的东西,闭包是自包含的函数代码块,可以在代码中被传递和使用。跟C 和 Objective-C 中的代码块(blocks)很相似 。这个大家必须掌握!必须掌握!必须掌握!重要的事情要说三遍

闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。下面我们就来攻克它!

1、闭包函数

官方在讲解闭包函数的时候一般都是使用一个sort() 的排序方法,我们来看看这个例子:

<pre name="code" ><span >let names = ["Chris","Alex","Ewa","barry","DanIElla"]func backwards(s1: String,s2: String) Bool {    return s1 > s2}</span>


 

这里我们定义了一个String 类型的数组,然后定义了一个function,接受两个 接收两个String 类型的参数,返回bool

然后我们来了解下sort() 我们这里对这个数组进行排序 按照我们定义的方法的规则,

var reversed = names.sort(backwards)
这个sort() 在swift 2.0加入数组,成为数组的成员方法可以直接调用 ,这里传入与数组类型相同的两个值,并返回bool ,如果返回true 就把第一个参数放在第二个前面 (也就是降序),反之你懂的

所以 ,我们这个函数的意思就是如果第一个比第二个参数大就返回true(s1>s2),所以是一个降序的排列 ,这里得到的结果是 :[Ewa,DanIElla,Chris,barry,Alex]

大家看着官方的sort() 也看不到具体的实现,所以这块有可能不是很清楚 ,那么我们自己写一个排序 ,也传入我们这个函数。

<span >func mySort (var arr:[String],sortStr:(String,String)->Bool)->[String]{    if(arr.count == 0){ return arr; }    let count = arr.count    var temp = ""    for i in 0..<count    {       for j in i+1..<count       {            if(!sortStr(arr[i],arr[j]))            {                temp = arr[i]                arr[i] = arr[j]                arr[j] = temp            }        }    }    return arr;}</span>

这其实就是一个简单的冒泡排序 ,只不过把规则交给调用者 。
调用方法 mySort(names,sortStr: backwards) 这里传入的是一个数组和一个函数类型 。得到结果 :[Ewa,Alex] 跟官方的sort一样的 。

下面的实例我们就用自己的sort 来讲,代码都在这里。大家可以看得明白 。

这里需要补充一个知识点。

<span >区间运算 :0...n  表示0-n的闭合区间  0..<n 表示一个包含0 不包含n半开半闭</span><span ><a target=_blank target="_blank" name="t2"></a>2、闭包表达式语法</span>

然而这是一个相当冗长的方式,本质上只是写了一个单表达式函数 (a > b),但是我们还要写一个函数 ? 当然不需要,下面我们用闭合表达式语法可以更好的构造一个内联排序闭包

<span >闭包表达式语法有如下一般形式:{ (parameters) -> returnType in        statements}</span>

闭包表达式语法可以使用常量、变量和inout类型作为参数,不提供默认值。 也可以在参数列表的最后使用可变参数。 元组也可以作为参数和返回值。

<span >let arr1 = mySort( (names),sortStr: { (s1:String,s2:String) -> Bool in    return s1>s2})</span>

这里我们把上面传入函数的地方,我们传入了一个闭包。这里就不做过多解释。完全按照上面的语法类型

根据上下文推断类型

因为我们写的mySort 第二个参数是类型为(String,String) -> Bool的函数,因此实际上String,String和Bool类型并不需要作为闭包表达式定义中的一部分。 因为所有的类型都可以被正确推断,返回箭头 (->) 和围绕在参数周围的括号也可以被省略:

所以我们的可以这样写 :

<span >let arr2 = mySort( (names),sortStr: { s1,s2 in return s1>s2 })</span>

看到没,智能的swift帮我们把闭包缩短了很多

单表达式闭包隐式返回

单行表达式闭包可以通过隐藏return关键字来隐式返回单行表达式的结果,我们这里是单行表达式 。
注:不要方便的用惯了多行表达式别也给省略了

<span >let arr3 = mySort( (names),s2 in s1>s2 })</span>
总结

以上是内存溢出为你收集整理的Swift之闭包全部内容,希望文章能够帮你解决Swift之闭包所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1091438.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存