关于Swift的闭包(closure)以及其在可选(Optional)类型中的应用

对于新手(如笔者)来说,闭包是Swift语言特性中很难理解的一部分。其原因可能有一部分在于一些人把复杂的函数写得很简单,新手会看不懂。闭包可以理解为把函数当做一个变量来看待。既然是变量,那么就自然可以作为参数传递给其它的函数。也就是说,实际上是把一个函数传递给了另一个函数。本文将详解闭包以及其在Optional型中的应用。

我们知道Swift采用了一种非常安全的称之为Optional的类型。这个Optional类型只可能有两种状态,一种是“什么都没有”(nil),另一种是“有什么东西”,只有这两种状态。对于第二种“有什么东西”的状态而言,有的东西即是写在问号之前的那个类型。需要提醒的是,例如 Int? 类型并不是“可以为空的整型”,而是“可以含有整型的Optional型”。

现在有一个课题,要求如下:

想返回整数a的平方,在a为空(nil)的情况下返回空(nil)。

如果用Optional binding来写的话可以写成下面这样

let result: Int?
if let a0 = a {
    result = a0 * a0
}

当然,为了让代码含义更清楚,也可以在 if { } 后面加上

else {
    result = nil
}

这当然没有问题,但是很遗憾的是仅仅为了得到一个整数的平方便要写这么多的代码实在是不值当。虽说optional很安全但是代价也不小。仔细想想也可以像下面这样简化代码。

let result: Int? = a == nil ? nil : a! * a!

虽然理论上可行,代码也很简单,但是一看就会发现,这显然不是Swift的风格。而且更重要的是,感叹号!是不安全的,应该避免使用。

在考虑代码如何写之前,先来回顾一下何为Optional类型:Optional型是可以有某值的可选类型。实际上,我们是有不把值从Optional中取出来而直接操作的办法的。

先来给出上面问题的答案:

let result: Int? = a.map { $0 * $0 }

如此便能够实现上述的功能。

为了便于理解,我们来逐步分析。

首先,Optional型的map函数提供了一个功能,可以不拆开Optional型而直接对其内部的变量进行操作。但是我们需要为map函数传递一个参数,该参数实际上又是一个函数,可以实现将整数平方的功能。所以,首先我们来写这样一个函数。

func square(someInteger: Int) -> Int {
      return someInteger * someInteger
}

接下来,我们只要把square函数作为自变量传递给map函数即可。

let result: Int? = a.map(square)

这样一来便可以实现上面的目的,接下来我们继续简化这段代码。我们可以把square的定义部分直接传递给map函数,这样也是可以实现目的的。具体如下:

let result: Int? = a.map({
    (someInteger: Int) -> Int in
    return someInteger * someInteger
})

区别在于,大括号原先的位置由 in 取代,而大括号则移动到了函数最前方。我们还知道,函数的返回值可以默认为最后一行代码的返回值,所以也可以删掉 return

,这样代码就变成了

let result: Int? = a.map({
    (someInteger: Int) -> Int in
    someInteger * someInteger
})

Swift是强语言类型,这意味着它可以根据上下文轻易推断出变量的类型。所以当变量类型显而易见的时候,也可以省略不写。代码就可以简化为

let result: Int? = a.map({
    someInteger in
    someInteger * someInteger
})

最后,函数的自变量名也可以简化(额。。不是省略),自变量在没有特殊命名时,默认按顺序用 $0 , $1 等来表示。所以someInteger这个变量就可以用$0代替,于是上面的代码还可以简化为:

let result: Int? = a.map({ $0 * $0 })

最后,作为自变量传递给map函数的函数可以写在小括号外面,即

let result: Int? = a.map() { $0 * $0 }

小括号也可以省略不写,于是便得到了上面的答案。

以上为闭包以及其简单的应用。根据用法,闭包可以大大简化代码,亦可以增强代码可读性。对于新手而言,确实是一个不好理解的知识点,需要反复琢磨。

时间: 2024-10-16 15:00:31

关于Swift的闭包(closure)以及其在可选(Optional)类型中的应用的相关文章

Swift的结构体,枚举,可选Optional,可选链

//: Playground - noun: a place where people can play import Cocoa var str0 = "Hello, playground" //类是引用类型,结构体与枚举是值类型 //*****************结构体*************** struct Point { var x = 0 var y = 1 //结构体的的方法 //为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating mutat

Swift语言精要-闭包(Closure)

闭包(Closure)这个概念如果没学过Swift的人应该也不会陌生. 学过Javascript的朋友应该知道,在Javascript中我们经常会讨论闭包,很多前端工程师的面试题也会问到什么是闭包. 那么,什么是闭包呢? 让我们看下在Javascript中闭包的解释: Closures are functions that have access to variables from another function’s scope. (This is often accomplished by

Swift中使用typealias定义一个闭包closure

在OC中我们定义一个Blocks是这样定义的: typedef void (^ZWProgressHUDCompletionBlock)(); 在Swift中定义一个闭包是这样的: typealias ZWProgressHUDCompletionBlock=()->Void 转载请注明!!!欢迎大家加入交流群:爱疯.爱Coding:209476515 Swift中使用typealias定义一个闭包closure,布布扣,bubuko.com

Swift:闭包

一.闭包的介绍 闭包表达式(Closure Expressions) 尾随闭包(Trailing Closures) 值捕获(Capturing Values) 闭包是引用类型(Closures Are Reference Types) 闭包是自包含的函数代码块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似. 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的

【Swift】闭包(Closures)

闭包表达式(Closure Expressions) 嵌套函数 是一个在较复杂函数中方便进行命名和定义自包含代码模块的方式.当然,有时候撰写小巧的没有完整定义和命名的类函数结构也是很有用处的,尤其是在您处理一些函数并需要将另外一些函数作为该函数的参数时. 闭包表达式是一种利用简洁语法构建内联闭包的方式. 闭包表达式提供了一些语法优化,使得撰写闭包变得简单明了. 下面闭包表达式的例子通过使用几次迭代展示了sort(_:)方法定义和语法优化的方式. 每一次迭代都用更简洁的方式描述了相同的功能. so

Swift:闭包(Closures)

一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, javascript中的函数嵌套等类似. 闭包能够捕获和存储上下文中定义的的不论什么常量和变量的引用. 这就是所谓的变量和变量的自封闭, 因此闭包还会处理全部捕获的引用的内存管理. 全局函数和嵌套函数事实上就是特殊的闭包. 闭包的形式有: (1)全局函数都是闭包.有名字但不能捕获不论什么值. (2)嵌套函数

swift 深入理解Swift的闭包

我们可用swift的闭包来定义变量的值. 先来一个简单的例子大家先感受感受. 定义一个字符串的变量的方法: 直接赋值 var str="JobDeer" 还可以用闭包的方式定义: var str:String={ return "JobDeer" }() 闭包还可以这么定义,省略了等号和括号: var str:String{ return "JobDeer" } 闭包中可以定义get方法. var str:String{ get{ return

Swift使用闭包表达式

Swift中的闭包表达式很灵活,其标准语法格式如下:{ (参数列表) ->返回值类型 in    语句组}其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字.Swift提供了多种闭包简化写法,这一节我们将介绍几种不同的形式.1.类型推断简化类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型.以下代码是标准形式的闭包:{(a:Int, b:Int) -> Int in    return a + b}Swift

javascript 闭包(closure)

<script type="text/javascript">    //闭包(closure):内层函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经结束    //注意内层函数引用的外层函数内的变量是外层函数执行结束后的最终值    test(1);    function test(a) { //外层函数        alert(a+' 外层函数开始执行');        setTimeout(function(){//内层函数