闭包表达式
- 在Swift中,可以通过
func
定义一个函数,也可以通过闭包表达式定义一个函数
func sum(_ v1:Int,_ v2:Int) -> Int {v1+v2}
var fn = {
(v1:Int,v2:Int) -> Int in
return v1+v2
}
fn(10,20)
写法:
{
(参数列表) -> 返回值类型 in
函数体代码
}
{
(v1:Int,v2:Int) -> Int in
return v1+v2
}(10,20)
类似于匿名函数,定义完直接调用
闭包表达式的简写
func exec(v1:Int,v2:Int,fn:(Int,Int) -> Int) {
print(fn(v1,v2))
}
exec(v1: 10, v2: 20, fn: {
(v1:Int,v2:Int) -> Int in
return v1+v2
})
exec(v1: 10, v2: 20, fn: {
v1,v2 in return v1+v2
})
exec(v1: 10, v2: 20, fn: {
v1,v2 in v1+v2
})
exec(v1: 10, v2: 20, fn: {$0 + $1})
exec(v1: 10, v2: 20, fn: +)
尾随闭包
- 如果将一个很长的闭包表达式作为函数的最后一个实参,使用尾随闭包可以增强函数的可读性
- 尾随闭包是一个被书写在函数调用括号外面(后面)的闭包表达式
func exec(v1:Int,v2:Int,fn:(Int,Int) -> Int) {
print(fn(v1,v2))
}
exec(v1: 10, v2: 20){
$0 + $1
}
- 如果闭包表达式是函数的唯一实参,而且使用了尾随闭包的语法,那就不需要在函数名后边写圆括号
func exec(fn:(Int,Int) -> Int) {
print(fn(1,2))
}
exec(fn: { $0 + $1 })
exec(){ $0 + $1 }
exec{ $0 + $1 }
示例 - 数组的排序
///返回true:i1排在i2前面
///返回false:i1排在i2后面
func cmp(i1:Int,i2:Int) -> Bool {
//大的排在前面
return i1>i2
}
var nums = [11,2,18,6,5,68,45]
nums.sort(by: cmp)
nums.sort(by: {
(i1:Int,i2:Int)->Bool in
return i1>i2
})
nums.sort(by: { i1,i2 in return i1 > i2})
nums.sort(by: { i1,i2 in i1 > i2})
nums.sort(by: { $0 > $1})
nums.sort(by: >)
nums.sort(){ $0 > $1 }
nums.sort{ $0 > $1 }
闭包
- 一个函数和它所捕获的变量/常量环境组合起来,称为闭包
- 一般指定义在函数内部的函数
- 一般它捕获的是外层函数的局部变量/常量
typealias Fn = (Int) -> Int
func getFn() -> Fn {
var num = 0
func plus(_ i:Int) -> Int {
num += i
return num
}
return plus
}
var fn = getFn()
print(fn(1))//1
print(fn(2))//3
print(fn(3))//6
print(fn(4))//10
- 可以把闭包想象成是一个类的实例对象
- 内存在堆空间
- 捕获的局部变量/常量就是对象的成员(存储的属性)
- 组成闭包的函数就是类内部定义的方法
class Closure {
var num = 0
func plus(_ i:Int) -> Int {
num += i
return num
}
}
var cs1 = Closure()
var cs2 = Closure()
cs1.plus(1)//1
cs2.plus(2)//2
cs1.plus(3)//4
cs2.plus(4)//6
cs1.plus(5)//9
cs2.plus(6)//12
typealias Fn = (Int) -> (Int,Int)
func getFn() -> (Fn,Fn) {
var num1 = 0
var num2 = 0
func plus(_ i:Int) -> (Int,Int){
num1 += i
num2 += i << 1
return (num1,num2)
}
func minus(_ i:Int) -> (Int,Int){
num1 -= i
num2 -= i << 1
return (num1,num2)
}
return (plus,minus)
}
let (p,m) = getFn()
p(5)//(5,10)
m(4)//(1,2)
p(3)//(4,8)
m(2)//(2,4)
知识点补充--Swift中的位运算符
- 主要功能:对二进制数据进行位运算等操作
- 常见的位运算符
var a: UInt8 = 0b00001000
var b: UInt8 = 0b01001010
(1)取反运算符“~”: ~a = 0b11110111
(2)与运算符“&”: a&b = 0b00001000
(3)或运算符“|”: a|b = 0b01001010
(4)异或运算符“^”: a^b = 0b01000010
(5)左移运算符“<<”: a<<1 = 0b00010000
(6)右移运算符“>>”: a>>1 = 0b00000100
网友评论