使用@autoclosure提高Swift代码质量

在Swift中方法终于成为了“一等公民”,可以作为参数被方法利用,在接触今天的内容之前,你必须了解Swift中方法和闭包的概念。Swift支持方法嵌套,Swift中的方法和闭包在类型上是有区别的。也就是说传入方法类型的参数也可以接收闭包,可是方法只能传入匹配方法返回值类型的参数,也就是说在运行方法前需要先执行参数中的方法算出返回值在传入参数运行调用该参数的方法,如果在一个方法中使用了多个判断语句可以提前中断,那么很多时候不需要知道后面的参数的具体值,比如下面的例子

func expensiveMethod() -> Bool{
    NSThread.sleepForTimeInterval(10.0)
    println("执行了很久")
    return true
    }

另外一个方法and需要传入两个Bool类型的参数:

func and(first:Bool,second:Bool)->Bool{
    println("执行and方法")
    return first&&second
    }

现在调用试试:

let result = and(false,second: expensiveMethod())

你会发现速度非常的慢,这是因为先运行expensiveMethod方法算出了返回值再去执行and方法的方法体。中控台打印:
执行了很久
执行and方法
而可能and方法的结果只通过第一个参数就可以执行了,这时候更好的办法是把第二个参数改为返回Bool类型的方法,然后传入一个闭包:

func and(first:Bool,getSecond:()->Bool)->Bool{
        if !first{
        return false
        }else{
        return getSecond()
        }
    }

调用的方法也要修改:

let result = and(false,getSecond: { return self.expensiveMethod()})

这样的修改运行速度变快了,但是程序员使用这个API的时候需要写完整的闭包结构,比较麻烦,这个时候@autoclosure就派上用场了。使用这个修饰符可以使API调用时输入返回值即可:

func and(first:Bool,@autoclosure getSecond:()->Bool)->Bool{
        if !first{
        return false
        }else{
        return getSecond()
        }
    }

这样在调用时就可以简化输入了:

let result = and(false,getSecond: expensiveMethod())

要注意的是@autoclosure只能用在()->T这样无参数的闭包中

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...