热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Swift5闭包Closure简明教程

系统:MacOS10.15.2,XCode11.3,swift5.0写作时间:2020-01-09说明Swift中的闭包(Closur

系统: Mac OS 10.15.2, XCode 11.3,swift 5.0
写作时间:2020-01-09


说明

Swift中的闭包(Closure) ,闭包的地位等同于OC中的Block!

Objc 闭包的写法

void (^printBlock)(NSString *x); printBlock = ^(NSString* str) { NSLog(@"print:%@", str); }; printBlock(@"hello world!");

Swift 闭包 的写法

// 定义语法
//{
// (参数列表) ->返回值类型 in
// 语句组
//}// 声明一个闭包(有两个整形参数,且返回值为整形的闭包)var sumClosure:((a: Int, b: Int) -> Int)// 实现闭包sumClosure = { (a: Int, b: Int) -> Int in return a + b}// 调用let sum = sumClosure(a: 10,b: 20)print(sum)

Swift 闭包重定义

// 有参数无返回值的typealias Myclosure1 = (str:String) ->Void// 有参数无返回值的
typealias Myclosure2=(str:String) ->String// 两个参数,一个返回值
typealias Myclosure3=(str:String,str:String)->String// 无参数,无返回值
typealias Myclosure4=()->Void// 使用如下var closure1: Myclosure1?closure1 = { (str: String) ->Void in print(str)} closure1!(str: "HelloWorld")

Swift 比较作为方法的参数

// MARK: - 闭包作为方法参数var closure4:Myclosure4?closure4 = { print("Swift")}func Fun(myclosure: Myclosure4) { myclosure()}Fun(closure4!)

Swift闭包 简化写法

// 形式1: 带有参数参数类型,参数名,返回值类型sumClosure = { (a: Int, b: Int) -> Int in return a + b}// 形式2: 省略参数类型
sumClosure = { (a,b) -> Int in return a + b}// 形式3: 省略返回值类型
sumClosure = { (a,b) in return a + b}// 形式4:省略参数小括号
sumClosure = { a,b in return a + b}// 形式5: 省略参数
sumClosure = { return $0 + $1}// 形式6: 省略关键字
returnsumClosure = { $0 + $1}

Swift 闭包常用方式


  1. 作为非空变量:

var closureName: (ParameterTypes) -> ReturnType

  1. 作为可为空变量:

var closureName: ((ParameterTypes) -> ReturnType)?

  1. 作为别名:

typealias ClosureType = (ParameterTypes) -> ReturnType

  1. 作为静态变量:

let closureName: ClosureType = { ... }

  1. 作为参数(用别名定义),在函数中:

funcName(parameter: (ParameterTypes) -> ReturnType)

注释: 如果在闭包中的参数会函数体外变化,需要添加修饰词@escaping.


  1. 作为函数回调的参数:

funcName({ (ParameterTypes) -> ReturnType in statements })

  1. 作为函数的参数(不用别名定义):

array.sorted(by: { (item1: Int, item2: Int) -> Bool in return item1 < item2 })

  1. 作为函数的参数(不用别名定义)&#xff0c;并隐藏参数类型(比如这里的item1: Int):

array.sorted(by: { (item1, item2) -> Bool in return item1 < item2 })

  1. 作为函数的参数(不用别名定义)&#xff0c;并隐藏返回值类型(比如返回值类型为Bool):

array.sorted(by: { (item1, item2) in return item1 < item2 })

  1. 作为函数的最后一个参数:

array.sorted { (item1, item2) in return item1 < item2 }

  1. 作为函数的最后一个参数&#xff0c; 省略掉参数声明:

array.sorted { return $0 < $1 }

  1. 作为函数的最后一个参数&#xff0c; 省略掉返回return关键字:

array.sorted { $0 < $1 }

  1. 作为函数的最后一个参数&#xff0c; 省略掉返回具体实现&#xff0c;只用符号表示比较:

array.sorted(by: <)

  1. 作为函数的参数&#xff0c;并清楚写清所有参数&#xff0c;返回值&#xff0c;类型&#xff0c;以及实现:

array.sorted(by: { [unowned self] (item1: Int, item2: Int) -> Bool in return item1 < item2 })

  1. 作为函数的参数&#xff0c;并清楚写清所有参数&#xff0c;返回值&#xff0c;以及实现。其中省略掉参数类型&#xff0c;返回值类型&#xff0c;由上下文推论得出:

array.sorted(by: { [unowned self] in return $0 < $1 })

参考

https://docs.swift.org/swift-book/LanguageGuide/Closures.html

https://www.jianshu.com/p/79ab32f60485

https://fuckingclosuresyntax.com/


推荐阅读
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
  • 深入理解Java反射机制
    本文将详细介绍Java反射的基础知识,包括如何获取Class对象、反射的基本过程、构造器、字段和方法的反射操作,以及内省机制的应用。同时,通过实例代码加深对反射的理解,并探讨其在实际开发中的应用。 ... [详细]
  • 行为设计模式:命令模式详解
    命令模式是一种行为设计模式,它通过将请求封装为对象,使得可以使用不同的请求来参数化客户端,支持请求的排队、日志记录以及提供命令的撤销和恢复功能。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 本文详细介绍了如何在最新版本的Xcode中重命名iOS项目,包括项目名称、应用名称及相关的文件夹和配置文件。通过本文,开发者可以轻松完成项目的重命名工作。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • ZOJ 2760 - 最大流问题
    题目链接:How Many Shortest Paths。题目描述:给定一个包含n个节点的有向图,通过一个n*n的矩阵来表示。矩阵中的a[i][j]值为-1表示从节点i到节点j无直接路径;否则,该值表示从i到j的路径长度。输入起点vs和终点vt,计算从vs到vt的所有不共享任何边的最短路径数量。如果起点和终点相同,则输出无穷大。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • 使用R语言进行Foodmart数据的关联规则分析与可视化
    本文探讨了如何利用R语言中的arules和arulesViz包对Foodmart数据集进行关联规则的挖掘与可视化。文章首先介绍了数据集的基本情况,然后逐步展示了如何进行数据预处理、规则挖掘及结果的图形化呈现。 ... [详细]
author-avatar
opheliamaizi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有