【发布时间】:2015-04-12 11:38:12
【问题描述】:
我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误,尤其是在多线程代码中。但是,在创建结构时,我看不到创建完全不可变的结构优于可变结构的任何好处。
让我们以一个保持分数的结构为例:
struct ScoreKeeper {
var score: Int
}
在这个结构中,我可以更改现有结构变量的 score 值
var scoreKeeper = ScoreKeeper(score: 0)
scoreKeeper.score += 5
println(scoreKeeper.score)
// prints 5
不可变版本如下所示:
struct ScoreKeeper {
let score: Int
func incrementScoreBy(points: Int) -> ScoreKeeper {
return ScoreKeeper(score: self.score + points)
}
}
及其用法:
let scoreKeeper = ScoreKeeper(score: 0)
let newScoreKeeper = scoreKeeper.incrementScoreBy(5)
println(newScoreKeeper.score)
// prints 5
我没有看到第二种方法比第一种方法的好处,因为结构是值类型。如果我传递一个结构,它总是被复制。因此,结构是否具有可变属性对我来说似乎并不重要,因为代码的其他部分无论如何都会处理单独的副本,从而消除了可变性问题。
不过,我看到有些人使用第二个示例,它需要更多代码而没有明显的好处。有什么我没有看到的好处吗?
【问题讨论】:
-
如果整个代码库中只有一个位置创建该类型的值,那么第二个肯定只需要更多代码吗?
-
This thread 是关于 C#,但在我看来,某些论点也适用于 Swift。
标签: swift struct functional-programming