为什么 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 IntInt,以及 returns ()、a.k.a。 Void

这是一项有意的设计决策,旨在阻止在其他表达式中使用变异副作用。你的案子正是他们希望阻止的。

为此增加一行可能很烦人,但请考虑一下:增加变量真的是 print 语句的工作吗?对我来说这听起来不像 "printing"。

所以基本上 += 这是一个运算符重载方法,就像 c++ 所以它是上面答案提到的 return 类型 Void () 的函数,所以它是打印 conunter ()

执行函数语句后就给counter赋值 这样理解起来就容易多了,第二次使用counter就会有值