Swift 闭包(Closures)

概述

闭包是字包含的的函数代码快,可以在代码快中被传递和使用。早些年Objc时期,有面试官问我如何看待blockdelegate 时候,个人比较倾向block的时候被提醒道:block会带来一些可读性和循环引用等问题。当然这也不能阻挡我对block的喜欢,最起码整洁度确实很好,有问题咱就搞清楚了。

闭包表达式

语法

{ (parameter) -> returnType in 
	//	statements
}

根据上述表达式中可以看出闭包的函数体部分由in关键字引入。

尾随闭包

ObjC中有很多Block作为函数参数的,在Swift 中闭包也是可以用作函数参数。作为参数的闭包,建议将闭包作为最后一个实参,增加可读性,我们将这种闭包称为尾随闭包


func operateCaculate(param1: Int, param2: Int, fun:(Int, Int) -> Int) {
    print("result is \(fun(param1, param2))")
}
operateCaculate(param1: 1, param2: 2, fun: {$0 + $1})

//	作为尾随闭包我们可以将其优化为这样的写法
operateCaculate(param1: 2, param2: 3) {
    $0 * $1
}

若尾随闭包为唯一参数时

func onePlusTwo(fn:(Int, Int) -> Int) {
    print("onePlusTwo result is \(fn(1, 2))")
}
onePlusTwo(fn: {$0 + $1})
onePlusTwo() {$0 + $1}
onePlusTwo{$0 + $1}

忽略参数

func ignoreParams(fn:(Int, Int) -> Int) {
    print(fn(3, 4))
}

ignoreParams{_, _ in 10}

自动闭包

我们来定义一个获取非空值的函数

func getUnnilValue(param1: Int?, param2: Int) -> Int {
    if let reusult = param1 {
        return reusult
    } else {
        return param2
    }
}
print(getUnnilValue(param1: 1, param2: 2));
print(getUnnilValue(param1: nil, param2: 2));

因为param2默认值是pram1为空的时候才会加载,故我们使用函数类型的param2让其延迟加载

func getUnnilValue1(param1: Int?, param2: ()-> Int) -> Int{
    if let reusult = param1 {
        return reusult
    } else {
        return param2()
    }
}
print(getUnnilValue1(param1: 1, param2: {2}));
print(getUnnilValue1(param1: nil, param2: {2}));

但是这样的可读性优点差,Swift 给我们提供了自动闭包@autoclosure 来解决这个问题。

func getUnnilValue2(param1: Int?, param2:@autoclosure ()-> Int) -> Int{
    if let reusult = param1 {
        return reusult
    } else {
        return param2()
    }
}
print(getUnnilValue2(param1: 1, param2: 2));
print(getUnnilValue2(param1: nil, param2: 2));

BTW

  • @autoclosure注解 会自动将param2的值2 分装成{2} 闭包
  • @autoclosure注解 只支持() -> T 格式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值