【发布时间】:2019-03-31 14:30:18
【问题描述】:
我遗漏了 Swift 中的可变性概念。我通常使用对象而不是结构来获得可观察性,因此值语义对我来说仍然是新事物。
struct Game {
var map: [[Int]]
所以我在这里声明map 是可变的。那么为什么在这样的方法中......
mutating func createPlayer() {
// emptyLocation -> (Int, Int)
let (X,Y) = emptyLocation()
map[X][Y] = .player
}
...我必须使用变异吗?是的,该函数正在变异,但原始结构是这样声明的。实际上,实际上每个func 似乎都是mutating,这似乎违背了标记的目的。
还有其他方法我应该这样做吗? mutating 的常见用法是否表明我应该避免的性能/内存问题?
更新:我对结构的内部状态“泄漏”到周围代码的方式感到非常不安;如果您在结构内声明成员var,那么它也必须在外部,即使您从未更改过。这违反了我能想到的所有封装概念。所以我将struct 更改为class,删除了所有mutating,并完成了它。我明白了,但我不确定我是否完全理解实施。对于这个 Swift-noob 来说,mutating 似乎是编译器可以在我不告诉它的情况下确定的东西 - 声明的成员是 var?,函数实际上会改变它吗?等等
【问题讨论】:
-
如果你改变了值类型中的任何属性,值类型就会改变,从而改变关键字。
-
@J.Doe - 我明白了,但是由于原始的“对象”被声明为 var,那么声明变异的目的是什么?系统已经知道我声明它是可变的。
标签: swift immutability