关键词是什么意思?

我正在尝试实现来自 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循环中使用。

有人确认吗?

33989 次浏览

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

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

在匿名函数中,没有 func声明行-它是匿名的!所以我们用一条 in线来代替。

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

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

*

闭包主体的开始由 in 关键字引入 关键字指示闭包的参数和 返回类型已完成,并且闭包的主体即将 开始。

*

来源: Https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/closures.html

闭包表达式语法的一般形式如下:

Closure Expression Syntax

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

{/参数和类型/in/功能体/}

但是对于那些可能想知道“但是为什么特别是关键字 in?”下面是苹果公司高级 Swift 编译工程师 Joe Groff 在 快速论坛上分享的一段历史:

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

func (arg: -> Type, arg: Type) -> Return { ... }

虽然这是很好的规则语法,但它当然也非常庞大 如果你想支持表达式功能 API, 例如在集合上映射/过滤器,或者如果您希望库能够 提供感觉像是 语言。

我们在苹果最早的采用者抱怨了这一点,并强制要求 我们支持 Ruby 风格的尾随闭包语法 适合于类似 Swift 的 C 风格语法,我们尝试了许多不同的 迭代,包括字面上的 Ruby 的 {|args| }语法,但是许多 他们遭受模棱两可或者只是厌恶和反抗我们 我们想要一些看起来仍然像其他部分的东西 语言,但可以明确地解析,并且可以 从一个完全显式的函数签名跨越用例的广度 非常紧凑。

我们已经把 in作为一个关键字,我们不能像 Java 那样使用 -> 是因为它已经被用来表示返回类型 担心像 C # 一样使用 =>会造成视觉上的混淆 使得 xs.map { x in f(x) }看起来有点像 for x in xs { f(x) }, 和 比起其他选择,人们更讨厌它

* 格式化和强调我的。并感谢 Nikita Belov 的岗位在斯威夫特论坛帮助我自己的理解。