我正在学习斯威夫特一本专门针对经验不足的人的书。困扰我的一件事是++语法。以下摘自本书:
var counter = 0
let incrementCounter = {
counter++
}
incrementCounter()
incrementCounter()
incrementCounter()
incrementCounter()
incrementCounter()
这本书说反击是5。
但我在Xcode游乐场输入了这些代码。这是4!
我很困惑。
答案 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()
的结果。
counter
的值永远不会真正打印在游乐场的右边区域(除非你写一行代表该行的结果:s表达式是counter
)。
答案 2 :(得分:1)
后递增和后递减运算符将其操作数的值增加(或减少)1,但表达式的值是操作数在递增(或递减)操作之前的原始值< / p>
因此,当您看到游乐场时,正在打印计数器的当前值。
但在评估函数后,计数器的值会发生变化,您可以在下一行看到更新的值。
答案 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;增加后期
答案 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