Swift`in`关键字含义?

Mar*_*tin 44 keyword ios swift

我正在尝试从parse.com实现一些代码,并且in在void之后我注意到一个关键字.

我很难过这是什么?你看到第二行了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.
  }
}
Run Code Online (Sandbox Code Playgroud)

文档没有记录这一点.我知道in关键字用在for循环中.

有谁确认?

mat*_*att 74

在命名函数中,我们在func声明行中声明参数和返回类型.

func say(s:String)->() {
    // body
}
Run Code Online (Sandbox Code Playgroud)

在一个匿名函数中,没有func声明行 - 它是匿名的!所以我们用in身体开始处的一条线代替它.

{
    (s:String)->() in
    // body
}
Run Code Online (Sandbox Code Playgroud)

(这是匿名函数的完整形式.但是Swift有一系列规则允许返回类型,参数类型,甚至参数名称和整in行在某些情况下都会被省略.)


luk*_*mtt 24

in这里的其他用户已经很好地回答了目的是什么的问题;总结:in是 Swift 闭包语法中定义的关键字,作为闭包中函数类型和函数体之间的分隔符:

{ /参数和类型//函数体in/ }

但对于那些可能想知道“但为什么特别是关键字?”的人来说,以下是 Apple 高级 Swift 编译器工程师 Joe Groff 在Swift 论坛in上分享的一些历史:

是我的错,对不起。在 Swift 的早期,我们有一个与传统 Javascript 非常相似的闭包语法:

func (arg: -> Type, arg: Type) -> Return { ... }
Run Code Online (Sandbox Code Playgroud)

虽然这是很好且常规的语法,但如果您尝试支持表达性功能 API(例如集合上的映射/过滤器),或者如果您希望库能够提供基于闭包的 API,那么它当然也非常庞大和尴尬感觉像是语言的延伸。

Apple 最早的采用者对此提出了抱怨,并要求我们支持 Ruby 风格的尾随闭包语法。这很难适应像 Swift 这样的 C 风格语法,我们尝试了许多不同的迭代,包括字面上的 Ruby{|args| }语法,但其中许多都存在歧义,或者只是我们早期采用者的厌恶和反抗。我们想要的东西仍然看起来像语言的其他部分,但可以明确地解析,并且可以跨越从完全显式函数签名到极其紧凑的用例的广度。

我们已经把它in作为关键字,我们不能->像 Java 那样使用,因为它已经用来表示返回类型,而且我们担心=>像 C# 那样使用会在视觉上太混乱。in 看上去xs.map { x in f(x) }隐隐约约像for x in xs { f(x) },而且人们对它的憎恨程度低于替代品

*我的格式和强调。感谢Nikita Belov在 Swift 论坛上的帖子帮助我理解。

  • “人们对它的厌恶程度低于其他选择。” 是我今天需要的验证。“In”是一个副词,试图代替这里的介词。使用“From”会更有意义。 (2认同)
  • 不是学究气,但这里的“in”肯定是用作介词的(不然的话,它修饰的是哪个“动词”?)。另外,“from”将是向后的:它是来自参数“x”的表达式“f(x)”,而不是相反。 (2认同)

Art*_*sev 11

闭包表达式语法具有以下一般形式:

闭包表达式语法


Ton*_*ony 7

*

闭包主体的开始由 in 关键字引入。这个关键字表示闭包的参数和返回类型的定义已经完成,闭包的主体即将开始。

*

来源:https : //developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html