为了账号安全,请及时绑定邮箱和手机立即绑定

swift 一个函数有多个闭包参数

swift 一个函数有多个闭包参数

慕田峪4524236 2019-03-20 14:13:17
swift 一个函数有多个闭包参数
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

Swift 标准库提供了 sort 函数,会根据您提供的排序闭包将已知类型数组中的值进行排序。 一旦排序完成,函数会返回一个与原数组大小相同的新数组,该数组中包含已经正确排序的同类型元素。

下面的闭包表达式示例使用 sort 函数对一个 String 类型的数组进行字母逆序排序,以下是初始数组值:
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
排序函数有两个参数:

  已知类型值的数组。
  一个闭包,采用相同类型的数组的内容的两个参数,并返回一个布尔值来表示是否将第一个值在排序时放到第二个值的前面或是后面。如果第一个值应该出现第二个值之前,闭包需要返回true,否则返回false。

该例子对一个 String 类型的数组进行排序,因此排序闭包需为 (String, String) -> Bool 类型的函数。

提供排序闭包的一种方式是撰写一个符合其类型要求的普通函数,并将其作为 sort 函数的第二个参数传入:
func backwards(s1: String, s2: String) -> Bool { return s1 > s2}var reversed = sort(names, backwards)// reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
如果第一个字符串 (s1) 大于第二个字符串 (s2),backwards 函数则返回 true,表示在新的数组中 s1 应该出现在 s2 前。 字符中的 "大于" 表示 "按照字母顺序后出现"。 这意味着字母 "B" 大于字母 "A", 字符串 "Tom" 大于字符串 "Tim"。 其将进行字母逆序排序,"Barry" 将会排在 "Alex" 之后,一次类推。

然而,这是一个相当冗长的方式,本质上只是写了一个单表达式函数 (a > b)。 在下面的例子中,利用闭合表达式语法可以更好的构造一个内联排序闭包。

  闭包表达式语法
  闭包表达式语法有如下一般形式:
{ (parameters) -> returnType in statements}
闭包表达式语法可以使用常量、变量和 inout 类型作为参数,但不提供默认值。 也可以在参数列表的最后使用可变参数。元组也可以作为参数和返回值。

下面的例子展示了之前 backwards 函数对应的闭包表达式版本的代码:
reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2})
需要注意的是内联闭包参数和返回值类型声明与 backwards 函数类型声明相同。 在这两种方式中,都写成了 (s1: String, s2: String) -> Bool类型。 然而在内联闭包表达式中,函数和返回值类型都写在大括号内,而不是大括号外。

闭包的函数体部分由关键字 in 引入。 该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。

因为这个闭包的函数体部分如此短以至于可以将其改写成一行代码:
reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
这说明 sort 函数的整体调用保持不变,一对圆括号仍然包裹住了函数中整个参数集合。而其中一个参数现在变成了内联闭包 (相比于 backwards 版本的代码)。



查看完整回答
反对 回复 2019-03-22
  • 2 回答
  • 0 关注
  • 1262 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信