【问题标题】:Swift `in` keyword meaning?Swift`in`关键字的含义?
【发布时间】:2015-08-03 10:30:59
【问题描述】:

我正在尝试从 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 循环。

有人确认吗?

【问题讨论】:

标签: ios swift keyword


【解决方案1】:

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

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

在匿名函数中,没有func 声明行——它是匿名的!所以我们在正文的开头使用in 行来代替。

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

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

【讨论】:

  • 谢谢马特,我不敢相信我错过了那个。感谢您指出。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    这是我的错,对不起。在 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 帮助我理解。

    【讨论】:

      【解决方案4】:

      *

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

      *

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-05
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 2017-07-20
        • 1970-01-01
        • 2016-03-31
        • 2018-09-13
        相关资源
        最近更新 更多