为什么 Swift 会发生这种情况?
Why this is happening in Swift?
let _ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in
print("conunter \(counter += 1)")
}
输出:
conunter ()
conunter ()
conunter ()
.........
但如果我这样做
let _ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in
counter += 1
print("conunter \(counter)")
}
它产生了预期的结果。为什么会这样?
因为 +=
运算符的特定函数具有类型 inout Int
和 Int
,以及 returns ()
、a.k.a。 Void
这是一项有意的设计决策,旨在阻止在其他表达式中使用变异副作用。你的案子正是他们希望阻止的。
为此增加一行可能很烦人,但请考虑一下:增加变量真的是 print
语句的工作吗?对我来说这听起来不像 "printing"。
所以基本上 +=
这是一个运算符重载方法,就像 c++
所以它是上面答案提到的 return 类型 Void ()
的函数,所以它是打印 conunter ()
。
执行函数语句后就给counter
赋值 这样理解起来就容易多了,第二次使用counter
就会有值
let _ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in
print("conunter \(counter += 1)")
}
输出:
conunter ()
conunter ()
conunter ()
.........
但如果我这样做
let _ = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in
counter += 1
print("conunter \(counter)")
}
它产生了预期的结果。为什么会这样?
因为 +=
运算符的特定函数具有类型 inout Int
和 Int
,以及 returns ()
、a.k.a。 Void
这是一项有意的设计决策,旨在阻止在其他表达式中使用变异副作用。你的案子正是他们希望阻止的。
为此增加一行可能很烦人,但请考虑一下:增加变量真的是 print
语句的工作吗?对我来说这听起来不像 "printing"。
所以基本上 +=
这是一个运算符重载方法,就像 c++
所以它是上面答案提到的 return 类型 Void ()
的函数,所以它是打印 conunter ()
。
执行函数语句后就给counter
赋值 这样理解起来就容易多了,第二次使用counter
就会有值