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 非常相似的闭包语法:
Run Code Online (Sandbox Code Playgroud)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) }
,而且人们对它的憎恨程度低于替代品。
*我的格式和强调。感谢Nikita Belov在 Swift 论坛上的帖子帮助我理解。
*
闭包主体的开始由 in 关键字引入。这个关键字表示闭包的参数和返回类型的定义已经完成,闭包的主体即将开始。
*
来源:https : //developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html
归档时间: |
|
查看次数: |
18765 次 |
最近记录: |