а также
час читаю отличноПродвинутый Свифт книга от objc.io, и я сталкиваюсь с чем-то, чего я не понимаю.
Если вы запустите следующий код на игровой площадке, вы заметите, что при изменении структуры, содержащейся в словаре, копия создается при доступе нижнего индекса, но затем оказывается, что исходное значение в словаре заменяется копией. Я не понимаю почему. Что именно происходит?
Кроме того, есть ли способ избежать копирования? По словам автора книги, нет, но я просто хочу быть уверен.
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 ?