а также

час читаю отличноПродвинутый Свифт книга от 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 ?

Ответы на вопрос(1)

Ваш ответ на вопрос