swift 闭包语法 apple编程文件

闭包表达式语法(Closure Expression Syntax)

闭包表达式语法有如下一般形式:

1
2
3
4
5
{ (parameters) -> returnType in
 
statements
 
}

  

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

也可以作为参数和返回值。

下面的例子展示了之前 backwards 函数对应的闭包表达式版本的代码:

1
2
3
4
5
reversed = sorted(names, { (s1: String, s2: String) -> Bool in
 
return s1 > s2
 
})

  

需要注意的是内联闭包参数和返回值类型声明与 backwards 函数类型声明相同。 在这两种方式中,都写成了 (s1: String, s2:

String) -> Bool 。 然而在内联闭包表达式中,函数和返回值类型都写在大括号内,而不是大括号外。

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

因为这个闭包的函数体部分如此短以至于可以将其改写成一行代码:

reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )

 

这说明 sorted 函数的整体调用保持不变,

包(相比于 backwards 版本的代码)。

一对圆括号仍然包裹住了函数中整个参数集合。而其中一个参数现在变成了内联闭

根据上下文推断类型(Inferring Type From Context)

 

 

因为排序闭包函数是作为 sorted 函数的参数进行传入的,Swift可以推断其参数和返回值的类型。 sorted 期望第二个参数是

类型为 (String, String) -> Bool 的函数,因此实际上 String , String 和 Bool 类型并不需要作为闭包表达式定义中的一部

分。 因为所有的类型都可以被正确推断,返回箭头 ( -> ) 和围绕在参数周围的括号也可以被省略:

reversed = sorted(names, { s1, s2 in return s1 > s2 } )

实际上任何情况下,通过内联闭包表达式构造的闭包作为参数传递给函数时,都可以推断出闭包的参数和返回值类型,这意

味着您几乎不需要利用完整格式构造任何内联闭包。

单表达式闭包隐式返回(Implicit Return From Single-Expression Clossures)

单行表达式闭包可以通过隐藏 return 关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为:

reversed = sorted(names, { s1, s2 in s1 > s2 } )

 

在这个例子中, sorted 函数的第二个参数函数类型明确了闭包必须返回一个 Bool 类型值。 因为闭包函数体只包含了一个单

一表达式 ( s1 > s2 ),该表达式返回 Bool 类型值,因此这里没有歧义, return 关键字可以省略。

参数名称缩写(Shorthand Argument Names)

Swift 自动为内联函数提供了参数名称缩写功能,您可以直接通过 $0 , $1 , $2 来顺序调用闭包的参数。

如果您在闭包表达式中使用参数名称缩写,您可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的类型会通过

函数类型进行推断。 in 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成:

reversed = sorted(names, { $0 > $1 } )

 

在这个例子中, $0 和 $1 表示闭包中第一个和第二个 String 类型的参数。

运算符函数(Operator Functions)

实际上还有一种更简短的方式来撰写上面例子中的闭包表达式。 Swift 的 String 类型定义了关于大于号 ( > ) 的字符串实现,

其作为一个函数接受两个 String 类型的参数并返回 Bool 类型的值。 而这正好与 sorted 函数的第二个参数需要的函数类型相

符合。 因此,您可以简单地传递一个大于号,Swift可以自动推断出您想使用大于号的字符串函数实现:

1
reversed = sorted(names, >)

posted on   漫思  阅读(4)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
历史上的今天:
2023-01-02 Goxel 3D Voxel Editor
2023-01-02 西南航空大瘫痪:上万航班被取消,竟因为90年代的IT系统
2023-01-02 webpack打包优化的几种手段
2023-01-02 webpack4.15.1 学习笔记(九) — 11个基础的插件使用
2023-01-02 webpack4.15.1 学习笔记(八) — 缓存(Caching)
2023-01-02 webpack4.15.1 学习笔记(七) — 懒加载(Lazy Loading)
2023-01-02 webpack4.15.1 学习笔记(六) — 代码拆分(Code Splitting)

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示