Swift使用闭包表达式

news/2024/7/20 21:56:06 标签: swift, Swift教程, Swift视频, ios, iOS8
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课堂微信公共平台



http://www.niftyadmin.cn/n/1036746.html

相关文章

AtCoder Beginner Contest 259 E - LCM on Whiteboard

加注释版。 原文&#xff1a; AtCoder Beginner Contest 259 E - LCM on Whiteboard_浅度断墨的博客-CSDN博客 #include<stdio.h> #include<iostream> using namespace std; #include<string> #include<string.h> #include<algorithm> #includ…

Swift数字类型之间的转换

Swift数字类型之间的转换Swift是一种安全的语言&#xff0c;对于类型的检查非常严格&#xff0c;不同类型之间不能随便转换。一、整型之间的转换在C和Objective-C等其他语言中&#xff0c;整型之间有两种转换方法&#xff1a;从小范围数到大范围数转换是自动的&#xff1b;从大…

Uncaught Error: A <Route> is only ever to be used as the child of <Routes> element, never rendered d

react路由 22年发生了不小的变化 21年是这样写的 import ./App.css; import React from "react"; import Index from "./components/index"; import Alinput from "./components/alinput"; import { BrowserRouter as Router,Route } from &quo…

AtCoder Beginner Contest 259 D Circumferences

题目&#xff1a; 题目链接&#xff1a; D - Circumferences (atcoder.jp) 题目思路&#xff1a; 题目所求为能否从一个点 通过圆边到达另外一点 因为每个圆之间有交点存在连通的可能性 我们就只需要判断两个点 1.是否都在圆上 2.所在的圆是否连通 因为涉及到连通的问题…

Swift字典集合

字典表示一种非常复杂的集合&#xff0c;允许按照某个键来访问元素。字典是由两部分集合构成的&#xff0c;一个是键&#xff08;key&#xff09;集合&#xff0c;一个是值&#xff08;value&#xff09;集合。键集合是不能有重复元素的&#xff0c;而值集合是可以重复的&#…

2.Java基础语法

类型转换 原因&#xff1a;开发中存在不同类型的变量或者数据赋值给其他类型的变量&#xff0c;也存在不同类型一起运算&#xff0c;其结果类型要确定下来 自动类型转换 原理&#xff1a;小范围类型的变量可以直接赋值给大范围类型的变量 范围信息 …

3.java程序设计流程控制

案例技术&#xff1a;随机数Random类 作用&#xff1a;产生一个随机数 步骤 1.导包(自动做的)import java.util.Random; 2.创建随机数对象:Random rnew Random(); 3.开始得到随机数:int datar.nextlnt(10);//从0到10 生产指定区间的随机数…

MySQL子查询之行子查询

顾名思义 行子查询 得出的数据是一行多列的数据 我们这两有一张staff 用户表 没错departmentid 是一个部门表的外键 我们可以清楚的看到 赵敏是开发部的 其他两个都属于人事部 如果我们想查询 与黄飞鸿 年龄和所属部门相同的数据 我们首先要查询出黄飞鸿的部门和名称 selec…