Почему Swift Array ведет себя иначе, чем списки других языков?

var sections = [[NoteItem]]()
var section = [NoteItem]()
sections.append(section)

someOtherArray.forEach{n in
    section.append(n)
}

debugPrint("\(section.count)") // prints 75 which is the length of someOtherArray
debugPrint("\(sections[0].count)") // prints 0! Why??

Последний вывод - это то, что я не могу понять. В C#, Java и многих других языках, которые я использовал, это будет иметь тот же вывод со вторым (т.е. 75), потому что переменная section и первый элемент sections, который является sections[0], являются одним и тем же объектом.

В Swift вроде бы не так. Фактически, если я сделаю это вместо этого:

var sections = [[NoteItem]]()
var section = [NoteItem]()

someOtherArray.forEach{n in
    section.append(n)
}

sections.append(section) // appending here after populating 'section'
debugPrint("\(section.count)") // prints 75 which is the length of someOtherArray
debugPrint("\(sections[0].count)") // prints 75 as expected!

Я бы получил ожидаемый результат.

Кто-нибудь может объяснить это? Спасибо.

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Array, Dictionary, String и многие другие типы - все это Value, основанные на Swift.

Поэтому выражение «это один и тот же объект» не имеет смысла, потому что, когда вы добавляете его в разделы, вы просто копируете значение раздела.

Я не знаю, что массивы в Swift являются типами значений (в отличие от других языков). Таким образом, содержимое раздела копируется в другой массив, когда раздел добавляется к разделам. Спасибо.

Sid Go 01.08.2018 06:36

Это не только Swift, в функциональных языках или неизменяемых языках почти все типы используют семантику значений. Предлагаю прочитать про (COW-CopyOnWrite).

farzadshbfn 01.08.2018 06:39

Другие вопросы по теме