Swift学习笔记——闭包的几种形式
闭包本节主要叙述的是闭包的几种形式,以及闭包的实际作用,闭包是一种自包含的函数代码块, 可以在代码中被传递和使用,闭包类似于C++中的Lambda 表达式,那么我们先来看看C++中Lambda 是怎么回事。先看一段简单的代码: int x = 10;
int y = 3;
int z ;
z = [=]()mutable throw() -> int {
int n = x + y;
x = y;
y = n;
return n;
}();
cout<<z<<endl;
cout<<"x:"<<x<<"t"<<"y:"<<y<<endl;
let names = ["Chris","Alex","Ewa","Barry","Daniella"]
reversed = sorted(names,{ (s1: String,s2: String) -> Bool in return s1 > s2 })
从这段简单的代码中我们可以看到swift中闭包具有以下格式: { (parameters) -> returnType in
statements
}
parameters是输出参数;returnType 是返回值类型;statements是执行代码。注意:在闭包中有一个关键字in,该关键字表示闭包的参数和返回值类型定义已经完成, 闭包函数体即将开始。这个是基本的swift闭包形式,
reversed = sorted(names,{s1,s2 in return s1 > s2})
根据上下文推断类型闭包可以是推断输出参数,输出类型。
reversed = sorted(names,{ s1,s2 in s1 > s2 } )
这种闭包形式就更加简洁,将return都省略了。
reversed = sorted(names,{ $0 > $1 } )
这种闭包简写简直让人吐血,什么都是省略类:
reversed = sorted(names,>)
这种闭包缩写让人看了以为代码写错了。简直无语,这也体现类swift的精简。
如果您需要将一个很长的闭包表达式作为最后一个参数传递给函数, 可以使用尾随闭包来增强函数的可读性。 尾随闭包是一个书写在函数括号之后的闭包表达式, 函数支持将其作为最后一个参数调用。 func someFunctionThatTakesAClosure(closure: () -> ()) { // 函数体部分 } // 以下是不使用尾随闭包进行函数调用 someFunctionThatTakesAClosure({ // 闭包主体部分 }) // 以下是使用尾随闭包进行函数调用 someFunctionThatTakesAClosure() { // 闭包主体部分 }
将上面的闭包形式用尾随闭包来写,如下: reversed = sorted(names) { $0 > $1 }
尾随闭包看起来就像Java中方法实现一样。这个对于我来说是很不习惯的,但是如果闭包代码比较多,尾随闭包却很有用,他可以代码看起来更加简洁。 至此,swift中所有的闭包形式就描述完了。但是swift闭包可以捕获和存储其所在上下文中任意常量和变量的引用。而不像C++中需要制定访问参数和访问类型等。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |