Крэш приложения при попытке создать массив


#1

Добрый день,

Столкнулся с непонятной для меня ситуацией. Во Фреймворк SwiftUI делаю приложение, в котором на определенном этапе надо сформировать массив данных из значений, хранящихся в Core Data и методом POST отправить этот массив на сервер.
Если я массив создаю простым наполнением значениями, то все работает правильно. Но при попытке создать массив с помощью получения данных из Core Data получаю ошибку Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

Вот код, где возникает ошибка

@Environment(.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: Products.getAllProducts()) var myProducts: FetchedResults

var excludeProd: Array?

init(){
for index in 0…<self.myProducts.count {
self.excludeProd?.append(String(self.myProducts[index].prodId))
}
}

Переменная excludeProd далее используется в сетевом запросе. Если эту переменную я создаю как excludeProd = [“id1”,“id2”,“id3”], то ошибка не возникает.

Подскажите, как можно решить эту проблему?

P.S. Почему то редактор упрямо добавляет лишнюю точку в конструкцию for. Там у меня две точки и знак меньше. Ошибка не из-за этого, такую опечатку не пропустить компилятор. Но он ошибок не выдает


#2
  1. У вас массив не инициализирован (он nil), когда вы в него пытаетесь добавить String.
  2. Тип данных в массиве так же не определён.

Решение: инициализировать массив до любой работы с ним и определить тип данных.

var excludeProd = [String]()

Вместо PS
Ещё одно напоминание новичкам: незнание языка, SwiftUI не компенсирует. А ещё он “не любит” частенько показывать где конкретно ошибка, что для новичка так себе ))


#3

Спасибо за ответ. Проблему решил, вы правы насчет компилятора, локализация ошибок зачастую неточная.
Впрочем, проблема оказалась не с инициализацией массива, который был опционалом. Оказалось, что массив стоило создавать не в init() класса ViewModel, а при вызове функции класса из View. Делал это в onAppear,
Пробовал реализовать ваш вариант, но ошибка появлялась в момент попытки обратиться в данным из Core Data


#4

Его там и не надо инициализировать. Достаточно это сделать до боди.