Я написал простую библиотеку для сериализации данных модели, а позже понял, что получаю записи в свои данные, когда только читал. Я был в состоянии свести задачу к следующей игровой площадке сниппета:Swift: всегда копирует на inout?
class Foo {
init() { name = "test" }
var name:String { didSet { print("setting name: \(self.name)") }}
}
func map(inout foo:String) {
print("writing value: \(foo)")
}
var foo:Foo = Foo()
map(&foo.name)
Результат есть (для меня) неожиданное:
письменность значение: тест
Имя параметра: тест
Я перечитал раздел по параметрам inout
, но не видел явного упоминания семантики копирования. Моя догадка заключается в том, что компилятор ожидает, что значение будет перезаписано, и делает это сам с начальным значением, если никакой другой код не делает этого.
Ожидается ли это, или ошибка компилятора? По моему скромному мнению, это неинтуитивное поведение. Я не ожидал заданий, если только он не был создан из моего кода, а это не так.
Чтобы указать, что, как мы надеемся, очевидно, фрагмент кода выше не нуждается в параметре inout, но я использовал общий интерфейс для чтения и записи.
Очень интересно! Btw вы можете уменьшить его еще больше: 'var x = 0 {didSet {print (" Setting ")}}; func f (inout x: Int) {}; F (& х) ' – Kametrixom