Как отфильтровать массив отфильтрованных данных Core Data


#1

Отфильтровал массив данных Core Data по одному значению, нужно теперь этот же массив отфильтровать по другому значению. Чтобы в конечном итоге получился массив по двум отфильтрованным значениям. Вот код который пока удалось написать

func filterLvlAndClassSpells(lvl: Int, classSp: String) ->[SpellsClassData]?{

    let context1 = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    let fetchRequest1:NSFetchRequest<SpellsClassData> = SpellsClassData.fetchRequest()
    
    var spellsFiltered1:[SpellsClassData]? = nil    //массив типа NSManageObject
    var spellsFiltered2:[SpellsClassData]? = nil
    
    let predicate1 = NSPredicate(format: "lvlSpellsData contains[c] %@" , "\(lvl)")
    fetchRequest1.predicate = predicate1
    
    do {
        spellsFiltered1 = try context1.fetch(fetchRequest1)
        // тут предполагаю фильтрацию массива по другому значению
        for i in 0...spellsFiltered1!.count  {
            let vel = spellsFiltered1?[i].value(forKey: "classSpellsData") as! String
            if vel.contains(classSp){
                spellsFiltered2?.append(spellsFiltered1![i])
            }
        }
        return spellsFiltered2
    }catch{
        return spellsFiltered1
    }
}

Вылетает ошибка в строке let vel = spellsFiltered1?[i].value(forKey: “classSpellsData”) as! String Thread 1: Fatal error: Index out of range


#2

Потому что индекс последнего элемента в массиве не равен количеству элементов в массиве. Если говорить про ваш код (который, к слову, выглядит так себе мягко скажем, потому что, один массив где-то зафорсин, а где-то оставлен опционалом), то решение будет такое:

for i in 0...(spellsFiltered1!.count - 1) но так конечно не делается.

Лучше использовать конструкцию с enumerated, если вам нужен индекс:

for (index, value) in spellsFiltered1.enumarated()

Ну и не понятно зачем вам опциональные массивы, если вы их всё равно возвращаете в любом случае? Проще их сделать сразу пустыми и разворачивать не придётся. И чекать пустой массив или нет, а не опционал, если это вдруг вам надо.

var spellsFiltered1 = [SpellsClassData]()
var spellsFiltered2 = [SpellsClassData]()