【问题标题】:what does ++ exactly mean in Swift?++ 在 Swift 中到底是什么意思?
【发布时间】:2016-06-12 07:02:52
【问题描述】:

我正在通过一本针对经验不足的人的书来学习 Swift。困扰我的一件事是 ++ 语法。以下内容来自书中:

var counter = 0
let incrementCounter = {
  counter++
}
incrementCounter()
incrementCounter()
incrementCounter()
incrementCounter()
incrementCounter()

书上说计数器是 5。

但我在 Xcode 游乐场中输入了这些代码。是4!

我很困惑。

【问题讨论】:

  • counter++可以翻译成counter = counter + 1,或者counter += 1
  • 不用担心 ++ 和 --。这些运算符已弃用,将从 swift 3 中删除。
  • 因为您是 Swift 的“新手”,所以最好避免使用 ++ 和 / 或 -- 运算符。它们将从 Swift 语言的未来版本中删除。而是按照 Shai 的建议使用 counter += 1

标签: swift post-increment


【解决方案1】:

++ 和 -- 在标识符之前加/减一,然后返回它的值。
++和--标识符后返回其值,然后加/减1。

They were removed 在 Swift 3.0 中,但您可以将它们添加回来:

prefix operator --
prefix operator ++
postfix operator --
postfix operator ++

prefix func ++(_ a : inout Int) -> Int {
    a += 1
    return a
}
prefix func --(_ a : inout Int) -> Int {
    a -= 1
    return a
}
postfix func ++(_ a: inout Int) -> Int {
    defer { a += 1 }
    return a
}
postfix func --(_ a: inout Int) -> Int {
    defer { a -= 1 }
    return a
}

var a = 11
print(a++) // 11
print(a)   // 12

var b = 5
print(--b) // 4
print(b) // 4

【讨论】:

    【解决方案2】:

    后自增和后减运算符将其操作数的值增加(或减少)1,但表达式的值是操作数在增加(或减少)操作之前的原始值

    所以当你看到 Playground 时,计数器的当前值正在被打印出来。

    但是在函数评估之后,计数器的值发生了变化,你可以在下一行看到更新的值。

    【讨论】:

      【解决方案3】:

      即使有很多答案并且所有答案都很清楚,我添加了这个 sn-p 来向您展示如何用“新”语法替换您的代码,其中 ++ 和或 -- 已被弃用。一开始是你自己的代码

      var counter = 0
      let incrementCounter = {
          counter++
      }
      let i0 = incrementCounter() // 0
      let i1 = incrementCounter() // 1
      // .....
      

      如何在未来的 Swift 语法中重写它?让我们试试推荐的替代品...

      var counter = 0
      let ic = {
          counter += 1
      }
      let i0 = ic() // () aka Void !!!
      let i1 = ic() // ()
      

      但是现在 ic() 的结果是 Void!嗯...好吧,下一次尝试可能看起来像

      var counter = 0
      let ic = {
          counter += 1
          return counter
      }
      

      但是现在代码没有编译错误:无法在当前上下文中推断闭包返回类型:-),所以我们必须声明它(在我们的原始版本中没有必要)

      var counter = 0
      let ic:()->Int = {
          counter += 1
          return counter
      }
      let i0 = ic() // 1
      let i1 = ic() // 2
      // .....
      

      它有效,但结果不一样。那是因为在原始代码中 ++ 运算符被用作后增量运算符。所以,我们需要对我们的“新”版本进行另一次调整

      var counter = 0
      let ic:()->Int = {
          let ret = counter
          counter += 1
          return ret
      }
      let i0 = ic() // 0
      let i1 = ic() // 1
      // .....
      

      是的,我希望看到我熟悉的一元 ++ 和/或 -- 也将出现在 Swift 的未来版本中

      【讨论】:

        【解决方案4】:

        五次调用incrementCounter 闭包后counter 的值将是5,但每次调用incrementCounter返回 似乎“滞后” 落后一步。正如 Sulthan 在他的回答中所写,这是因为 x++ 是一个后增量运算符:表达式的结果将在增量之前返回

        var x = 0
        print(x++) // 0
        print(x)   // 1
        

        此外,正如我在上面的评论中所写,您不应使用 ++-- 运算符,因为它们将是 deprecated in Swift 2.2 and removed in Swift 3。但是,如果您对 post-vs pre-increment 运算符的详细信息感兴趣,您可以在此处找到关于 SO 标记为其他语言但涵盖相同主题的好答案,例如


        然而,值得一提的是,与 Swift > 2.1 相关,但与 ++ 运算符并没有真正的关系。

        当你启动关闭incrementCounter

        var someOne : Int = 0
        let incrementCounter = {
            someInt
        }
        

        闭包被隐式推断为() -> Int类型:一个闭包接受零个参数,但只有一个Int类型的返回。

        let incrementCounter: () -> Int = {
            return someInt
        }
        

        因此,您在 Playground 中看似“看到”的是对 incrementCounter 闭包的调用的未使用(未分配)返回值;即表达式incrementCounter()的结果。

        counter 的值永远不会真正打印在您操场的右侧块中(除非您编写一行,其中该行:s 表达式的结果为counter)。

        【讨论】:

        • dfri,您喜欢将一元 ++ 和/或 -- 从语言中删除的决定吗?请查看我的“答案”和注释:-)
        • @user3441734 你提出了一些有趣的观点。然而,希望闭包的类型推断在未来的 Swift 中会变得更好(例如,您的第三个代码块应该编译并推断闭包为() -> Int)。就我个人而言,我喜欢利用副作用,因此包括表达。例如++,但我完全理解 Swift 删除这些的决定,因为通用代码安全是 Swift 的典型代表,我相信他们希望在其范围内也包括针对 logical 错误的安全性。在这种情况下,++-- 在经验不足的程序员使用或代码阅读时会造成一些危险。
        【解决方案5】:

        你正在做的事情是后增量。

        先了解前后增量的区别

        1. 在后增量中,增量后的值计数器包含增量值 (即 5) 但如果我们返回,那么它将包含 旧值 (即 4)
        2. 在 Pre Increment 中,值和返回值都递增。

        现在让我们看看你的代码,

        counter++ 制作副本,增加计数器,并返回副本(旧值)。

        所以如果您打印 counter 它将具有递增值 (即 5) 但是,如果您返回计数器 (即您的使用 incrementCounter) 它包含旧值 (即 4)

        因为其中 incrementCounter 最多只能显示 4。

        检查输出 解决方案:

        counter++ 更改为++counter

        检查输出

        【讨论】:

          【解决方案6】:

          x++ 运算符是一种用于多种语言的运算符 - C、C++、Java(请参阅C answer 了解同一问题)

          称为后增量。它将给定变量加一,但在评估当前表达式之后。例如:

          var x = 1
          var y = 2 + x++
          // the value of x is now 2 (has been incremented)
          // the value of y is now 3 (2 + 1, x has been evaluated before increment)
          

          这与++x(预增量)运算符不同:

          var x = 1
          var y = 2 + ++x
          // the value of x is now 2 (has been incremented)
          // the value of y is now 4 (2 + 4, x has been evaluated after increment)
          

          请注意,该运算符将在 Swift 的下一版本中删除,因此您不应再使用它。

          最好只写x += 1,而不是有副作用的复杂表达式。

          【讨论】:

            猜你喜欢
            • 2017-08-07
            • 2017-07-20
            • 2014-09-23
            • 2014-07-25
            • 2012-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多