Swift 3.0基础学习之闭包

前言

闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。下面这篇文章就来详细介绍了关于Swift 3.0中的闭包,感兴趣的一起来看看吧。

开始

闭包的书写格式如下:

{ (parameters) -> return type in
statements
}

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

使用的时候可以简化为

reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

也可以简化为

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

甚至可以简化为

reversedNames = names.sorted(by: { $0 > $1 } )

$0为第一个参数,以此类推

返回布尔值的话可以直接给一个判断符号,如

reversedNames = names.sorted(by: >)

尾部闭包

reversedNames = names.sorted() { $0 > $1 }

或者(无其他参数的情况下)

reversedNames = names.sorted { $0 > $1 }

这两个方式均可

捕捉值

如下代码,闭包可以获取和修改其周围的变量

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
 var runningTotal = 0
 func incrementer() -> Int {
 runningTotal += amount
 return runningTotal
 }
 return incrementer
}

以上函数返回一个闭包,闭包里添加了读取和修改闭包的外部变量runningTotal

let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()
// returns a value of 10
incrementByTen()
// returns a value of 20
incrementByTen()
// returns a value of 30

闭包引用类型

可以通过用这种方式引用闭包并且调用:

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()

@escaping

传递给函数的闭包如果不是在函数内调用,而是在函数内用外部变量保存当前的闭包,在合适的时间再进行调用,这是就需要在闭包参数前加入@escaping关键字,不然编译器会报错。

比较好理解的就是经常用到的网络请求,请求完成才执行完成的闭包。

官方的例子如下:

//需要加@escaping的情况
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
 completionHandlers.append(completionHandler)
}
//直接在函数内调用传入的闭包则不需要@escaping
func someFunctionWithNonescapingClosure(closure: () -> Void) {
 closure()
}

@autoclosure 自动闭包

// customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: () -> String) {
 print("Now serving \(customerProvider())!")
}
serve(customer: { customersInLine.remove(at: 0) } )
// Prints "Now serving Alex!"

如上代码所示,我们加入一个返回类型为String的闭包,需要在外面加上{},为了书写方便, 加上@autoclosure关键字,那么这个对{}就可以省略了。

// customersInLine is ["Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: @autoclosure () -> String) {
 print("Now serving \(customerProvider())!")
}
serve(customer: customersInLine.remove(at: 0))
// Prints "Now serving Ewa!"

编译器会帮我们标记这行代码为闭包,这段代码不会马上被调用,而是当成闭包在函数里调用的时候才被调用。

参考英语原文:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Swift能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 深入理解Swift语言中的闭包机制

    在 Swift 中的闭包类似于结构块,并可以在任何地方调用,它就像 C 和 Objective C 语言内置的函数. 函数内部定义的常数和变量引用可被捕获并存储在闭包.函数被视为封闭的特殊情况,它有 3 种形式. 在 Swift 语言闭合表达式,如下优化,重量轻语法风格,其中包括: 推导参数并从上下文菜单返回值的类型 从单封表达的隐性返回 简略参数名称 尾部闭包语法 语法 下面是一个通用的语法定义用于闭包,它接受参数并返回数据的类型: 复制代码 代码如下: {(parameters) -> re

  • Swift中闭包实战案例详解

    前言 无论苹果的官方文档还是由官方文档衍生出来的一些文章和书籍都比较重视基础语法知识的讲解,对于实战中的应用提及的都很少,所以当我们想使用"闭包"解决一些问题的时候,会忽然出现看着一堆理论知识却不知从何下手的尴尬感,这就是理论和时实战的区别了. 本文不赘述Swift闭包的的基本语法了,百度或者Google下有很多资料.如题所示本文着重讲述Swift闭包的一些实战案例,有需要的小伙伴可以参考下,经验丰富的大神也请指教. 关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很

  • Swift 中闭包的简单使用

    本文主要是介绍Swift中闭包的简单使用,将从"闭包的定义"."闭包的创建.赋值.调用"."闭包常见的几种使用场景","使用闭包可能引起的循环强引用" 四个方面入手,重点介绍闭包如何使用,没有高深的概念,只是专注于实际使用,属于入门级水平,后面还会有关于闭包更加详细和深入理解的文章.希望大家在阅读完本文后能够对闭包有一个整体的理解以及能够简单的使用它. 闭包的定义 在Swift开发文档中是这样介绍闭包的:闭包是可以在你的代码中

  • Swift教程之闭包详解

    闭包(Closures)是独立的函数代码块,能在代码中传递及使用.Swift中的闭包与C和Objective-C中的代码块及其它编程语言中的匿名函数相似. 闭包可以在上下文的范围内捕获.存储任何被定义的常量和变量引用.因这些常量和变量的封闭性,而命名为"闭包(Closures)".Swift能够对所有你所能捕获到的引用进行内存管理. NOTE 假如你对"捕获(capturing)"不熟悉,请不要担心,具体可以参考Capturing Values(捕获值). 全局函数

  • 详解Swift中的函数及函数闭包使用

    一.引言 函数是有特定功能的代码段,函数会有一个特定的名称调用时来使用.Swift提供了十分灵活的方式来创建与调用函数.事实上在Swift,每个函数都是一种类型,这种类型由参数和返回值来决定.Swift和Objective-C的一大区别就在于Swift中的函数可以进行嵌套. 而Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法.Swift中的闭包语法风格十分简洁,其作用和函数的作用相似. 二.函数的创建与调用 函数通过函数名,参数和返回值来定义,参数和返

  • IOS swift3.0 下闭包语法整理

    IOS swift3.0 下闭包语法整理 一.闭包的概念 有oc基础的都知道,闭包其实是oc里面的block,语法格式不一样,但作用是一样的.主要是用于callBack(异步回调)或者两个类之间的通信.它的本质一个函数,一个可执行的代码块,只是这个函数是没有名字的,也就是匿名函数.你也可以把他看作如 int.float一样,是一种数据类型,一种可以作为参数传递的数据类型. 二.基本语法 1.闭包的声明 //定义一个求和闭包 //闭包类型:(Int,Int)->(Int) let add:(Int

  • Swift 3.0基础学习之闭包

    前言 闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似.下面这篇文章就来详细介绍了关于Swift 3.0中的闭包,感兴趣的一起来看看吧. 开始 闭包的书写格式如下: { (parameters) -> return type in statements } 如 reversedNames = names.sorted(by: { (s1: String, s2: Str

  • Swift 3.0基础学习之类与结构体

    前言 和其他语言不同的是,Swift不需要为自定义的类和结构体创建接口和实现文件.只需要创建单一文件用来创建类和结构体,其他的外部接口的代码系统会自动生成.下面这篇文章主要介绍了关于Swift 3.0类与结构体的内容,感兴趣的朋友一起来看看吧. 类和结构体区别 Swift的类和结构体具有以下相同的特点: 可以定义属性来保存值 可以定义方法来提供功能 可以定义下标来使用他们的值 可以定义初始化器来配置他们的初始化状态 可以在默认的实现上扩展他们的功能 遵从协议来提供标准的功能 类具有结构体没有的额

  • Swift 3.0基础学习之扩展

    介绍 扩展可以为类,结构体,枚举和协议添加新的功能.包括可以对没有源码访问权限的类型进行扩展.扩展和 Objective-C 分类 的概念类似.(和 Objective-C 的分类不一样的是,Swift 扩展没有名称). 在 Swift 中,扩展可以做到: 添加计算的实例属性和计算的类型属性 定义实例方法和类型方法 提供新的初始化器 定义下标 定义并使用新的嵌套类型 使现有类型符合协议 值得注意的是:扩展可以为类型添加功能,但是不可以重写现有的功能. 扩展语法 使用关键字 extension 定

  • Swift 3.0基础学习之枚举类型

    枚举语法 使用关键字 enum 定义一个枚举 enum SomeEnumeration { // enumeration definition goes here } 例如,指南针有四个方向: enum CompassPoint { case north case south case east case west } 这里跟 c 和 objective-c 不一样的是,Swift 的枚举成员在创建的时候没有给予默认的整型值.所以上面代码中的东南西北并不是0到3,相反,不同的枚举类型本身就是完全

  • Swift 3.0基础学习之下标

    前言 类,结构体和枚举都可以定义下标,使用下标可以快速访问集合,列表或者序列的数据成员元素.可以使用someArray[index]来访问Array, 使用someDictionary[key]来访问Dictionary. 一个类型可以定义多个下标. 定义一个get set的下标: subscript(index: Int) -> Int { get { // return an appropriate subscript value here } set(newValue) { // perf

  • 0基础学习前端开发的一些建议

    以下纯属个人观点和建议,肯定是有局限性的,但是也希望能给你带来一些帮助. 我们俨然能感受到前端岗位现在已经发展成了最重要的研发岗位之一,所以多我们提出的要求也就越来越高了.所以我们需要的也就不仅仅只是掌握css.html.JavaScript了,但是这三大件一直都是前端的根本,这一点从未改变,而这三大件中JavaScript又是重中之重. 接下来我会结合我的一点经验,给出前端系统学习路线的一些具体建议以及入门前端时的一些困境. 入门前端时的一些困境 1.因一些基础算法.数据结构理论不扎实导致一些

  • swift 3.0中realm封装类示例代码

    前言 如果你用够了FMDB或者CoreData,不妨试试realm,本文主要给大家介绍了关于swift 3.0中realm封装类的相关内容,分享出来供大家参考学习,下面来一起看看吧. 最新更新,特别感谢@deepindo /// 查询排序后所有数据,关键词及是否升序 static func selectScoretByAll<T: Object>(_: T.Type ,key: String, isAscending: Bool) -> Results<T>{ return

  • Swift 3.0 enum 的灵活使用介绍

    1. 前言 一晃半年了,从之前的顺丰优选跳槽到现在的闪银,都没有时间好好写文章,先进行自我批评,最近在忙开源项目,在造各种轮子的过程中,深深的体会到了Swift中enum的便利,直接上代码. 2. Objective-C 中的enum typedef NS_ENUM(NSUInteger, UserType) { UserTypeStudent, UserTypeTeacher, UserTypeStaff, UserTypeAdministrator, UserTypeOther }; 这是一

  • avaScript基础学习-基本的语法规则

    目录 一.运算符 二.分支语句 三.循环语句 四.异常的捕获与处理 五.js中的this关键字 六.let与const定义变量使用规则 七.js中的void链接 八.异步编程setTimeout 九.函数闭包 一.运算符 js中的+-*/运算与c语言较为相似,简写方式也类似 ++.--.+=.%=等运算规则也相同 在js中===代表绝对等于(值与类型都相同才算相同) !==(不绝对等于)值和类型有一个不相同或者都不相同为真 js中还支持三目运算符 a>b?'a大于b':'b大于a' 二.分支语句

  • 值得收藏的asp.net基础学习笔记

    值得收藏的asp.net基础学习笔记,分享给大家. 1.概论 浏览器-服务器 B/S 浏览的 浏览器和服务器之间的交互,形成上网B/S模式 对于HTML传到服务器  交给服务器软件(IIS)  服务器软件直接读取静态页面代码,然后返回浏览器 对于ASPX传达服务器  交给服务器软件(IIS)   IIS发现自己处理不了aspx的文件,就去映射表根据后缀名里找到响应的处理程序(isapi,服务器扩展程序) 问题:IIS如何调用可扩展程序? 答:可扩展程序首先就是按照IIS提供的借口实现代码,所以I

随机推荐