我已經知道不可變性在可變性方面的優勢,能夠推理代碼並引入更少的錯誤,特別是在多線程代碼中。儘管如此,在創建結構體時,我看不到任何好處,無法在可變結構體上創建完全不可變的結構體。不可變結構體對可變結構體的好處是什麼?
讓我們爲保持一些分數結構的一個例子:
struct ScoreKeeper {
var score: Int
}
在這種結構中,我可以改變現有的結構變量
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
我沒有看到第二種方法比第一種方法的好處,因爲結構是值類型。如果我傳遞一個結構體,它總是被複制。因此,如果結構具有可變屬性,對我來說似乎並不重要,因爲代碼的其他部分無論如何都會在單獨的副本上工作,從而消除了可變性問題。
雖然我見過一些使用第二個例子的人,但這需要更多的代碼纔沒有明顯的好處。我沒有看到一些好處嗎?
當然,如果整個代碼庫中只有一個位置創建該類型的值,那麼第二個代碼只需要更多代碼? – delnan
[This thread](http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil)是關於C#的,但在我看來,一些參數也適用於Swift。 –