Swift`in`关键字含义?

时间:2015-05-21 16:12:57

标签: ios swift keyword

我正在尝试从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关键字。

有人确认吗?

4 个答案:

答案 0 :(得分:66)

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

func say(s:String)->() {
    // body
}

在匿名函数中,没有func声明行 - 它是匿名的!所以我们在身体的开头用in行代替。

{
    (s:String)->() in
    // body
}

(这是匿名函数的完整形式。但是Swift有一系列规则允许返回类型,参数类型,甚至参数名称和整个{{1}在某些情况下要删除行。)

答案 1 :(得分:3)

*

  

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

*

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

答案 2 :(得分:2)

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

Closure Expression Syntax

答案 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 帮助我理解。