我正在尝试从parse.com实现一些代码,并且在void之后我注意到一个关键字in
。
我很难过这是什么?您看到Void in
PFUser.logInWithUsernameInBackground("myname", password:"mypass") {
(user: PFUser?, error: NSError?) -> Void in
if user != nil {
// Do stuff after successful login.
} else {
// The login failed. Check error to see why.
}
}
文档没有记录这一点。我知道在in
循环中使用了for
关键字。
有人确认吗?
答案 0 :(得分:66)
在命名函数中,我们在func
声明行中声明参数和返回类型。
func say(s:String)->() {
// body
}
在匿名函数中,没有func
声明行 - 它是匿名的!所以我们在身体的开头用in
行代替。
{
(s:String)->() in
// body
}
(这是匿名函数的完整形式。但是Swift有一系列规则允许返回类型,参数类型,甚至参数名称和整个{{1}在某些情况下要删除行。)
答案 1 :(得分:3)
*
闭包的主体的开头由in关键字引入。这个 关键字表示闭包的参数和定义 返回类型已经完成,并且封闭的主体即将到来 开始。
*
答案 2 :(得分:2)
答案 3 :(得分:2)
in
的目的是什么的问题已经在这里得到了其他用户的很好的回答;总结:in
是 Swift 闭包语法中定义的关键字,作为闭包中函数类型和函数体之间的分隔符:
{ /参数和类型/ in
/函数体/ }
但对于那些可能想知道“但为什么特别是关键字 in
?”的人,Apple 的高级 Swift 编译器工程师 Joe Groff 在 Swift forums 上分享了一些历史:< /p>
<块引用>
是我的错,对不起。在 Swift 的早期,我们有一个闭包 与传统 Javascript 非常相似的语法:
func (arg: -> Type, arg: Type) -> Return { ... }
虽然这是很好的规则语法,但它当然也非常笨重 如果你试图支持富有表现力的函数式 API,就会很尴尬, 例如集合上的映射/过滤器,或者如果您希望库能够 提供基于闭包的 API,感觉像是 语言。
Apple 最早的采用者对此有所抱怨,并强制要求
我们支持 Ruby 风格的尾随闭包语法。这很棘手
适合像 Swift 这样的 C 风格的语法,我们尝试了许多不同的
迭代,包括字面上的 Ruby 的 {|args| }
语法,但许多
他们饱受模棱两可或只是厌恶和反抗我们的
早期采用者。我们想要一些看起来仍然像其他部分的东西
语言的,但可以明确地解析并且可以
从完全显式的函数签名跨越广泛的用例
非常紧凑。
我们已经把in
当成了关键字,我们不能像Java那样使用->
是因为它已经被用来表示返回类型,而我们
担心像 C# 一样使用 =>
会在视觉上过于混乱。 in
使 xs.map { x in f(x) }
看起来有点像 for x in xs { f(x) }
,
并且人们对它的讨厌程度低于其他选择。
*格式化和强调我的。并感谢 Swift 论坛上的 Nikita Belov's post 帮助我理解。