++在Swift中究竟意味着什么?

时间:2016-02-29 09:40:34

标签: swift post-increment

我正在学习斯威夫特一本专门针对经验不足的人的书。困扰我的一件事是++语法。以下摘自本书:

var counter = 0
let incrementCounter = {
  counter++
}
incrementCounter()
incrementCounter()
incrementCounter()
incrementCounter()
incrementCounter()
这本书说反击是5。

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

我很困惑。

6 个答案:

答案 0 :(得分:2)

x++运算符是一种运算符,用于多种语言 - C,C ++,Java(对于同一问题,请参阅C answer

它被称为后增量。它将给定变量递增1,但在计算当前表达式之后。例如:

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而不是带有副作用的复杂表达式。

答案 1 :(得分:2)

在您对counter关闭的五次调用之后,incrementCounter的值为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
}

因此,您在游乐场中看到的"" incrementCounter关闭调用的未使用(未分配)返回值;即表达式incrementCounter()的结果。

enter image description here

counter的值永远不会真正打印在游乐场的右边区域(除非你写一行代表该行的结果:s表达式是counter)。

答案 2 :(得分:1)

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

因此,当您看到游乐场时,正在打印计数器的当前值。

playground

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

答案 3 :(得分:1)

即使有很多答案,而且所有答案都很清楚,我添加了这个代码段,向您展示如何使用&#39; new&#39;替换代码。语法,其中++和或 - 已弃用。首先是你自己的代码

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 :(得分:0)

你正在做的事情是增加后期。

首先了解Pre&amp; amp;增加后期

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

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

    因此,如果您打印 计数器 ,它将增加值(即5)但是,如果您返回计数器(即您的使用incrementCounter执行此操作它包含旧值(即4)

    因为 incrementCounter 仅显示最多4个。

    检查输出  enter image description here 解决方案:

    counter++更改为++counter

    检查输出 enter image description here

答案 5 :(得分:0)

++和-在标识符加/减之前,然后返回其值。
++和-在标识符返回其值之后,然后加/减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

相关问题