Экземпляр Swift Struct изменяется при обновлении его значения - PullRequest
0 голосов
/ 09 апреля 2019

Я заметил, что когда мы меняем значение свойства struct, то создается новый объект struct.

struct StructureTest {
    var i: Int

    mutating func changeValue(_ val: Int) {
        i = val
    }
}

var st = StructureTest(i: 10) {
    didSet{
        print("struct changed")
    }
}

print("before: \(st)")
st.changeValue(20)
print("after: \(st)")

Выход:

before: StructureTest(i: 10)   
struct changed
after: StructureTest(i: 20)

Главное, что я заметил, что после изменения значения свойства. Новый объект структуры создан и назначен на var st.

Я знаю, что такое «типы значений» и что такое «копировать при назначении».

Но я не могу понять, почему это происходит здесь? Может я что-то здесь упускаю? Дайте мне знать, если вы знаете причину создания этого нового экземпляра структуры.

Наряду с этим у меня есть еще один наблюдатель:

Если у меня есть массив структур. Вроде как:

struct StructureTest {
    var i: Int

    mutating func changeValue(_ val: Int) {
        i = val
    }
}

var arrStructs = [StructureTest(i: 10), StructureTest(i: 20)] {
    didSet {
        print("arrStructs changed")
    }
}

arrStructs[0].changeValue(30)

Выход:

arrStructs changed

Я не могу понять, почему происходит изменение массива?

Насколько я могу понять из функции "copy of write" для типов значений. Это должно произойти, когда массив модифицируется, и емкость массива требует создания нового массива, но в этом случае причина модификации массива мне не ясна.

Дайте мне знать, если вы знаете причину этого или можете предоставить мне любую ссылку для разъяснения.

Извините за мои грамматические ошибки. Надеюсь, суть проблемы вам ясна.

1 Ответ

2 голосов
/ 09 апреля 2019

Структуры имеют семантику значений, поэтому, когда вы изменяете структуру, вы присваиваете ей новое значение; т.е. вы изменили значение, которое содержит переменная. Массив в swift является общей структурой, и поэтому он также имеет семантику значений (в отличие от большинства языков, где массив является ссылкой). Поэтому, если вы изменяете какой-либо элемент массива, вы меняете значение всего массива.

...