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!
Я бы получил ожидаемый результат.
Кто-нибудь может объяснить это? Спасибо.



Array, Dictionary, String и многие другие типы - все это Value, основанные на Swift.
Поэтому выражение «это один и тот же объект» не имеет смысла, потому что, когда вы добавляете его в разделы, вы просто копируете значение раздела.
Это не только Swift, в функциональных языках или неизменяемых языках почти все типы используют семантику значений. Предлагаю прочитать про (COW-CopyOnWrite).
Я не знаю, что массивы в Swift являются типами значений (в отличие от других языков). Таким образом, содержимое раздела копируется в другой массив, когда раздел добавляется к разделам. Спасибо.