【问题标题】:Swift equivalent of Objective-C expression?Swift 相当于 Objective-C 表达式?
【发布时间】:2015-06-01 18:02:03
【问题描述】:

以下表达式在 Swift 中是什么意思:

 [wordmarkFrameAnimation addKeyFrames:@[
     ({
         IFTTTAnimationKeyFrame *keyFrame = [IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(1) andFrame:CGRectOffset(self.wordmark.frame, 200, 0)];
         keyFrame.easingFunction = IFTTTEasingFunctionEaseInQuart;
         keyFrame;
     }),
 ]];

我知道外部是一个数组(@[...]),但是以({ 开头并以}) 结尾的部分是什么意思?

【问题讨论】:

  • 我不明白这个问题
  • 这是 Obj-C 中从表达式创建数组的一种迂回方式,其中表达式派生自作用域块 {...}。范围的最后一条语句:keyFrame 形成表达式的值(尽管我没有使用或测试过它)。如果您想在 Swift 中使用类似的形式,您可以(我认为)将 ({...}) 替换为内联闭包的执行,形式为:'{... keyFrame stuff in here... }()'

标签: ios objective-c swift


【解决方案1】:

与 Swift 不同,Objective-C - 因为它是 C - 可以使用简单的花括号在任何地方创建本地范围。此外,通过GCC extension to the C language,当花括号本身被括号包围时,此范围可用于生成一个值——即花括号中的最后一个表达式。因此,这是一种定义、配置和返回keyFrame inline 的方式。

因此,要理解 Swift 术语的含义,请将其大致等同于这种事情,这实际上是一个相当常见的 Swift 习惯用法(我称之为define-and-call):

let arr : [UIView] = [
    {
        let v = UIView(frame:CGRectMake(0,0,100,100))
        v.opaque = true
        v.backgroundColor = UIColor.redColor()
        return v
    }()
]

【讨论】:

  • 这是 GCC 的一个特性(也被 clang 支持),称为“语句表达式”。括号和大括号都是必需的。 gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
  • 局部作用域{ ... }和语句表达式({ ... })不一样。前者确实 not 具有价值(据我所知)。 – “在 Objective-C 中,每个语句都有一个值” 我不确定这是否正确。
  • 我不明白你的意思,但是;{ ; }{ 12; }if (1 < 2) { } 都是有效的(Objective-)C 语句,但不是 表达式我>。它们都没有价值。
  • @matt 不正确。语句表达式是表达式,而不是语句。 (这就是它们被这样称呼的原因。)也有表达式语句,但它们没有值,因为它们是语句,而不是表达式。所以:在 C 和 Objective-C 中,语句永远不会有值。 (或者反过来:有值的东西总是一个表达式。)
  • @MartinR 即使12; 也没有任何价值。当然,包含的表达式 12 有值,但语句 (12;) 没有值。 C 或 Objective-C 中没有语句具有值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2014-09-13
  • 2016-01-16
相关资源
最近更新 更多