0
点赞
收藏
分享

微信扫一扫

swift 闭包

小北的爹 2023-03-10 阅读 88


闭包时可以在你的代码中被传递和引用的功能性独立代码快

闭包能够捕获和存储定义在其上下文中的任何常量和变量的引用,这也就是所谓的闭合并包裹那些常量和变量,因此被称为闭包,Swift能够为你处理所有关于捕获的内存管理的操作,

在函数章节中有介绍的全局和内嵌函数,实际上是特殊的闭包。闭包符合如下三种形式的一种:

1、全局函数时一个有名字但不会捕获任何值的闭包

2、内嵌函数时一个有名字且能从其上层函数捕获值的闭包

3、闭包表达式是一个轻量级语法所写的 并且可以捕获其上下文中常量或变量值的没有名字的闭包

 

闭包表达式

闭包表达式是一种在简单行内就能写完闭包的语句

-从sorted函数说起

Swift 的标准库提供了一个叫做soret(by:)的方法,会根据你提供的飘絮闭包将已知类型的数组的值进行排序,一旦它排序完成,sorted(by:)方法会返回与原数组类型大小完全一致的新数组,该数组的是已经排序好的,原数组不会被sorted(by:)方法修改

 

//: A UIKit based Playground for presenting user interface

import UIKit

let names=["zhangsan","lisi","wangwu","zhaoliu"]
func backward(_ s1:String,_ s2:String)->Bool{
return s1>s2
}
var reversedNames = names.sorted(by:backward)
print(reversedNames)

["zhaoliu", "zhangsan", "wangwu", "lisi"]
闭包表达式语句
闭包表达式能够使用常量形式参数,变量形式参数和输入输出形式参数,但不能提供默认值。
可变形参也能使用,但需要在形式参数列表的最后面使用。
元组也可被用来作为形式参数和返回类型。
{(parameters)-> (return type) in
statements
}

将上面的语法改为闭包表达式

//: A UIKit based Playground for presenting user interface

import UIKit

let names=["zhangsan","lisi","wangwu","zhaoliu"]

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

从语境中推断类型

因排序闭包为实际参数来传递函数,故Swift能推断它的心事参数类型和返回类型

sorded(by:) 方法期望它的形式参数是一个(String,String)->Bool 类型的函数。这意味着(String,String)和bool类型不需要被写成闭包表达式定义中的一部分,因为所有的类型都能被推断,返回箭头(->)和围绕在形式参数名周围的括号也能被省略

//: A UIKit based Playground for presenting user interface

import UIKit

let names=["zhangsan","lisi","wangwu","zhaoliu"]

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

还能省略return

从单表达式闭包隐式表达式返回

单表达式闭包能够通过从他们的声明中删掉return关键字来隐式返回他们单个表达式的结果

//: A UIKit based Playground for presenting user interface

import UIKit

let names=["zhangsan","lisi","wangwu","zhaoliu"]

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

还能简写

简写实际参数名

Swift 自动对行内闭包提供简写实际参数名,可以通过$0 $1 等名称来引用闭包参数的实际值

//: A UIKit based Playground for presenting user interface

import UIKit

let names=["zhangsan","lisi","wangwu","zhaoliu"]

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

还能简化。。

Swift的String类型定义关于大于号(>)的字符串实现,让其作为一个有两个String类型形式参数的函数并返回一个Bool类型的值。这正好与soorted(by:)方式的形式参数需要的函数相匹配,因此,你能简单地传递一个大于号,并且Swift将推断你想使用大于号特殊字符串函数实现

//: A UIKit based Playground for presenting user interface

import UIKit

let names=["zhangsan","lisi","wangwu","zhaoliu"]

var reversedNames = names.sorted(by:>)
print(reversedNames)

尾随闭包

如果你需要将一个很擦还给你的闭包表达式作为函数的最后一个实际函数传递给函数没使用尾随闭包将增强函数的可读性,尾随闭包是一个被书写在函数形式参数的括号外面(后面的闭包)的闭包表达式

//: A UIKit based Playground for presenting user interface

import UIKit

let names=["zhangsan","lisi","wangwu","zhaoliu"]
var reversedNames = names.sorted{$0>$1}
print(reversedNames)

 

 

 

举报

相关推荐

0 条评论