在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这样无参数的闭包中