Swift使用闭包表达式

简介: <span style="font-size:14px;">Swift中的闭包表达式很灵活,其标准语法格式如下:<br>{ (参数列表) ->返回值类型 in<br>    语句组<br>}<br>其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。<br>Swift提供了多种闭包简化写法,这一节我们将介绍几种不同的形式。<br>1.
Swift中的闭包表达式很灵活,其标准语法格式如下:
{ (参数列表) ->返回值类型 in
    语句组
}
其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。
Swift提供了多种闭包简化写法,这一节我们将介绍几种不同的形式。
1.类型推断简化
类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型。以下代码是标准形式的闭包:
{(a:Int, b:Int) -> Int in
    return a + b
}
Swift能推断出参数a和b是Int类型,返回值也是Int类型。简化形式如下:
{a, b in return a + b }
使用这种简化方式修改后的示例代码如下:
func calculate(opr :String)-> (Int,Int)-> Int {


    var result : (Int,Int)-> Int
    
    switch (opr) {
    case "+" :
        result = {a, b in return a + b }        ①
    default:
        result = {a, b in return a - b }        ②
    }
    return result;
}


let f1:(Int,Int)-> Int = calculate("+")
println("10 + 5 = \(f1(10,5))")


let f2:(Int,Int)-> Int = calculate("-")
println("10 + 5 = \(f2(10,5))")


上述代码第①行和第②行的闭包是上一节示例的简化写法,其中a和b是参数,return后面是返回值。怎么样?很简单吧?
2.隐藏return关键字
如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:
{a, b in a + b }
使用这种简化方式修改后的示例代码如下:
func calculate(opr :String)-> (Int,Int)-> Int {


    var result : (Int,Int)-> Int
    
    switch (opr) {
    case "+" :
        result = {a, b in return a + b }        ①
    default:
        result = {a, b in return a - b }        ②
    }
    return result;
}



上述代码第①行和第②行的闭包return关键字省略了,需要注意的是,省略的前提是闭包中只有一条return语句。下面这样有多条语句是不允许的。
{a, b in var c; a + b }
3.缩写参数名称
上一节介绍的闭包表达式已经很简洁了,不过,Swift的闭包还可以再进行简化。Swift提供了参数名称缩写功能,我们可以用$0、$1、$2来表示调用闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。
使用参数名称缩写,还可以在闭包中省略参数列表的定义,Swift能够推断出这些缩写参数的类型。此外,in关键字也可以省略。参数名称缩写之后如下所示:
{$0 + $1}
使用参数名称缩写修改后的示例代码如下:
func calculate(opr :String)-> (Int,Int)-> Int {


    var result : (Int,Int)-> Int
    
    switch (opr) {
    case "+" :
        result = {$0 + $1}	①
    default:
        result = {$0 - $1}	②
    }
    return result;
}


let f1:(Int,Int)-> Int = calculate("+")
println("10 + 5 = \(f1(10,5))")


let f2:(Int,Int)-> Int = calculate("-")
println("10 + 5 = \(f2(10,5))")


上述代码第①行和第②行的闭包采用了参数名称缩写。
4.使用闭包返回值
闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改add和sub闭包,示例代码如下:
let c1:Int = {(a:Int, b:Int) -> Int in
                return a + b
          }(10,5)    	①


println("10 + 5 = \(c1)")


let c2:Int = {(a:Int, b:Int) -> Int in
                    return a - b
                }(10,5)    	②


println("10 - 5 = \(c2)")


上述代码有两个表达式,第①行代码是给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1是Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。第②行代码也是如此。通过这种方法可以为变量和常量直接赋值,在有些场景下使用非常方便。


更多内容请关注国内第一本Swift图书 《Swift开发指南》
本书交流讨论网站: http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

欢迎关注智捷iOS课堂微信公共平台


目录
相关文章
|
3月前
|
存储 Swift
Swift 语言:什么是闭包(Closure)?它们与函数的区别是什么?
Swift 语言:什么是闭包(Closure)?它们与函数的区别是什么?
36 1
|
4月前
|
存储 Swift
Swift中,函数和闭包
Swift中,函数和闭包
34 1
|
6月前
|
Swift
swift 闭包简写实际参数名$0、$1等理解
swift 闭包简写实际参数名$0、$1等理解
29 0
|
存储 编译器 开发者
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包
448 0
Swift-进阶 09:闭包(二)逃逸闭包 & 非逃逸闭包
|
存储 Swift C++
Swift-进阶 09:闭包(一)使用&捕获原理
Swift-进阶 09:闭包(一)使用&捕获原理
430 0
Swift-进阶 09:闭包(一)使用&捕获原理
|
存储 编译器 Swift
Swift - 闭包捕获值原理分析
先说原理本质: 编译器在堆上开辟空间,存放了捕获的值
Swift - 闭包捕获值原理分析
|
API Swift 开发者
Swift3.0带来的变化汇总系列三——函数和闭包写法上的微调
Swift3.0带来的变化汇总系列三——函数和闭包写法上的微调
86 0
|
算法 搜索推荐 编译器
Swift讲解专题八——闭包
Swift讲解专题八——闭包
145 0
|
存储 Swift
14.Swift学习之闭包
闭包引入 计算1个数的平方 函数写法 func square(param:Int) -> Int{ return param * param } square(param:3) 闭包写法 let squareCloure = {...
1045 0
|
iOS开发 索引 Swift
swift4.1 系统学习十一 闭包
// // main.swift // swift11(闭包) // // Created by iOS on 2018/10/10. // Copyright © 2018年 weiman. All rights reserved. // import Foundation /* 闭包 闭包是swift中比较重要的一部分内容,也是个人认为比较难以理解的内容,也可能是之前没有 细细的研究的缘故。
1369 0

相关课程

更多