Semântica rápida em relação ao acesso ao dicionário
Atualmente estou lendo o excelenteSwift avançado livro de objc.io, e estou encontrando algo que não entendo.
Se você executar o código a seguir em um playground, notará que, ao modificar uma estrutura contida em um dicionário, uma cópia é feita pelo acesso ao subscrito, mas parece que o valor original no dicionário é substituído pela cópia. Eu não entendo o porquê. O que exatamente está acontecendo?
Além disso, existe uma maneira de evitar a cópia? Segundo o autor do livro, não há, mas eu só quero ter certeza.
import Foundation
class Buffer {
let id = UUID()
var value = 0
func copy() -> Buffer {
let new = Buffer()
new.value = self.value
return new
}
}
struct COWStruct {
var buffer = Buffer()
init() { print("Creating \(buffer.id)") }
mutating func change() -> String {
if isKnownUniquelyReferenced(&buffer) {
buffer.value += 1
return "No copy \(buffer.id)"
} else {
let newBuffer = buffer.copy()
newBuffer.value += 1
buffer = newBuffer
return "Copy \(buffer.id)"
}
}
}
var array = [COWStruct()]
array[0].buffer.value
array[0].buffer.id
array[0].change()
array[0].buffer.value
array[0].buffer.id
var dict = ["key": COWStruct()]
dict["key"]?.buffer.value
dict["key"]?.buffer.id
dict["key"]?.change()
dict["key"]?.buffer.value
dict["key"]?.buffer.id
// If the above `change()` was made on a copy, why has the original value changed ?
// Did the copied & modified struct replace the original struct in the dictionary ?