【Swift4】(6) 闭包 | 闭包应用 | 闭包作为函数参数 | 捕获特性

简介: 【Swift4】(6) 闭包 | 闭包应用 | 闭包作为函数参数 | 捕获特性

闭包 Closure

闭包的基本使用与简写

  • 语法优化
var myClosure:() -> Void = {
    print("Hello world")
}
myClosure()
var mySecondClosure:(Int,Int) -> Int = {
    (a:Int,b:Int) -> Int in //闭包标准写法
    return a*b
}
mySecondClosure = {
    (a,b) in //闭包简写,类型自动推导 可以根据参数推断
    return a*b
}
mySecondClosure = {
    (a,b) in //进一步闭包简写,如果函数体只包含一句 return 代码,可省略 return
    a*b
}
mySecondClosure = {
    $0 * $1 
//再简写:被捕获的参数列表中,含有a、b,下标从0开始,可通过"$"获取。省略参数列表 (a, b)和 关键字 in
}

闭包应用

  • 排序
var arr:[Int] = [1,3,5,6,7,2,4,6,8]
arr.sorted() //[1, 2, 3, 4, 5, 6, 6, 7, 8]
arr.sorted {
    $0 > $1  //[8, 7, 6, 6, 5, 4, 3, 2, 1]
}
var arr = [0,1,2,3,4,5,6,7,8,9,10]
arr.sorted {
    return fabs(Float($0-5)) < fabs(Float($1-5))  //离5越近排在越前面 [5, 4, 6, 3, 7, 2, 8, 1, 9, 0, 10]
}
  • 遍历
//forEach
var arr2 = [5,6,7,8,9]
arr2.forEach {
    print("\($0)")  //[5, 6, 7, 8, 9]
}
var arr3 = [1,2,3,4]
//filter
arr3.filter {
    return $0 > 3   //[4]
}
var arr4 = ["0","1","imagine"]
//map
var num = arr4.map {
    Int($0) //[0, 1, nil] 类型转换可能失败,所以返回的是可选型
}
var num2 = arr4.compactMap {
    Int($0) //[0, 1] //compactMap : 解包->展开并合并
}
//reduce
var arr5 = [0,1,2]
var sum = arr5.reduce(0) {
    return $0 + $1  //3
}

闭包作为函数参数

func handler(_ a: Int, _ b: Int,operation:(Int,Int)->Int) ->Int {
    let res = operation(a,b)
    return res
}
let multipyClosure = { //实现一个闭包
    (a:Int,b:Int) in
    a * b
}
handler(2, 3, operation: multipyClosure) //将闭包作为参数传递

捕获

闭包可以从上下文环境中捕获常量、变量,并在自己的作用域内使用。

//捕获
var num = 3
arr.sorted {
    return fabs(Float($0-num)) < fabs(Float($1-num))  //向外层找变量 num
}


相关文章
|
15天前
|
Swift C++ 索引
Swift开发——简单函数实例
函数是编程的基础,用于封装特定功能的代码。它们有关键词func、函数名、参数列表(可为空)和返回类型。多返回值可通过元组、数组、inout参数或可选类型实现。例如,返回元组 `(value1, value2)`,数组 `[value1, value2]` 或使用可选数组 `[[Double]]?`。函数可以作为其他函数的参数,类似闭包或Lambda表达式。在Swift中,示例展示了通过元组、带索引的元组、数组和可选类型返回多个值的函数。还演示了如何使用inout参数交换变量值。
26 5
Swift开发——简单函数实例
|
2月前
|
机器学习/深度学习 数据采集 TensorFlow
【Swift开发专栏】Swift与机器学习:构建智能应用
【4月更文挑战第30天】本文探讨了使用Swift开发机器学习应用,分为三个部分:机器学习基础(定义、类型及应用),Swift在机器学习中的作用(Swift for TensorFlow、Core ML及性能优势),以及实践技巧(数据预处理、特征工程、模型训练与部署、性能优化和用户界面集成)。通过学习,开发者能掌握构建智能应用的技能,利用Swift的性能和安全性提升应用效率。随着深入学习,开发者可探索更多高级特性和技术,如深度学习和复杂数据分析。
|
2月前
Swift4.0判断本函数是否在其它类有相同的方法
Swift4.0判断本函数是否在其它类有相同的方法
22 0
|
2月前
|
编译器 Go Swift
【Swift开发专栏】Swift中的错误处理与异常捕获
【4月更文挑战第30天】Swift的错误处理机制通过遵循`Error`协议的类型定义和传播错误,以声明式方式捕获和处理问题。本文分为三部分:1) 错误定义与传播,包括自定义错误类型和使用`throw/try/catch`处理;2) 错误处理语法,如必须和可选捕获,以及错误传播;3) 实际应用中的最佳实践,如清晰定义错误、使用错误码和避免滥用错误处理。理解并熟练运用这些机制能提升代码的可靠性和可维护性。
|
2月前
|
缓存 Swift UED
【Swift开发专栏】Swift应用的启动优化
【4月更文挑战第30天】本文介绍了Swift应用启动优化技巧,包括优化代码结构和资源加载。建议减少启动时加载的代码,采用延迟加载、分模块加载和懒加载策略;优化初始化代码,注意顺序、异步初始化和避免全局初始化。对于资源,压缩图片、使用矢量图和图片缓存可提升加载速度。文中还提供了实战案例,展示如何在代码中实施这些优化措施。
|
2月前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
2月前
|
缓存 算法 Swift
【Swift 开发专栏】Swift 应用的性能优化技巧
【4月更文挑战第30天】本文探讨了Swift应用性能优化,强调理解性能瓶颈、针对性优化和平衡性能与代码质量的重要性。提出优化技巧,包括选择合适数据结构、避免不必要的对象创建、使用缓存、优化算法、减少计算、管理内存、利用多核处理、优化网络请求和界面渲染。通过实际案例分析证明了这些方法能有效提升应用性能和用户体验。开发者应持续关注新技术和方法,以适应不断提升的性能要求。
|
2月前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
61 0
|
2月前
|
存储 API Swift
【Swift开发专栏】Swift函数与闭包的实战应用
【4月更文挑战第30天】本文介绍了 Swift 中函数和闭包的实战应用。首先,函数的基本使用包括定义、参数与返回值、函数类型以及高级技巧如嵌套函数。接着,讨论了闭包的语法,包括无名函数、作为函数参数、简写形式和尾随闭包。最后,展示了函数和闭包在实战中的应用,如排序过滤集合和处理异步任务的回调。
|
2月前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。