2015-10-06 2 views
3

Я написал простую библиотеку для сериализации данных модели, а позже понял, что получаю записи в свои данные, когда только читал. Я был в состоянии свести задачу к следующей игровой площадке сниппета: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, но я использовал общий интерфейс для чтения и записи.

+1

Очень интересно! Btw вы можете уменьшить его еще больше: 'var x = 0 {didSet {print (" Setting ")}}; func f (inout x: Int) {}; F (& х) ' – Kametrixom

ответ

3

Я отправляю это от имени Joe Groff, быстротекущей разработчик компилятора, on Twitter (см ответов). Он был очень хорош в ответе на мой твиттер, который упоминает этот вопрос.

Он говорит:

Inout имеет значение-результат семантикой. Команда didSet получает модифицированное значение в конце inout. Он только оптимизирует передачу по ссылке, если разница ненаблюдаема (по модулю неверного сглаживания). Книга Swift также должна быть обновлена ​​этой информацией.

2

In the document:

Вы пишете параметр Inout, помещая Inout ключевое слово в начале его определения параметра. Параметр in-out имеет значение, которое передается функции, изменяется функцией и возвращается обратно из функции в вместо исходного значения.

вход-выход параметр не «вызов по ссылке», но «call-by-copy-restore»

Смежные вопросы