Как отфильтровать элемент из массива NSObject - PullRequest
1 голос
/ 29 апреля 2019

Ниже мои 2 объекта

Мышцы

struct MuscleListObject {
    var strMuscleName: String = ""
    var arrMuscleExercise: [MuscleExerciseListObject] = []
}

ExerciseObject

struct MuscleExerciseListObject {
    var strExerciseName: String  = ""
}

Я знаю фильтр «Мышцы», но я хочу, чтобы поиск предметов был мудрым. как я могу это сделать? пожалуйста, ведите меня об этом.

arrSearchedMuscle = self.arrExercise.filter({ objMuscle in
    if let name = objMuscle.strMuscleName as? String, let query = searchBar.text {
        return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil
    }
    return false
})

EDIT

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchText.count == 0 {
            isSearching = false
            arrSearchedMuscle = arrExercise
        }
        else {
            isSearching = true

            let query = searchText
            arrSearchedMuscle = arrExercise.compactMap { category -> MuscleListObject? in
                if category.strMuscleName.range(of: query, options: [.caseInsensitive]) != nil {
                    return category
                } else {
                    arrSearchedExercise = category.arrMuscleExercise.filter({ $0.strExerciseName.range(of: query, options: [.caseInsensitive]) != nil  })
                    if arrSearchedExercise.isEmpty {
                        return nil
                    } else {
                        let newCategory = category
                        newCategory.arrMuscleExercise = arrSearchedExercise
                        return newCategory
                    }
                }
            }
            print(arrExercise)
            print(arrSearchedMuscle)
        }
        self.tblVWExercise.reloadData()
    }

Пожалуйста, сообщите мне о вызове фильтра Заранее спасибо

1 Ответ

1 голос
/ 29 апреля 2019

Если заголовок Muscle содержит поисковый запрос, вернуть весь объект Muscle.Если нет, отфильтруйте объекты с помощью поискового запроса и верните обновленный объект Muscle.Если конкретный объект Muscle не содержит поискового запроса, вернуть nil

let query = "band"
arrSearchedMuscle = arrExercise.compactMap { category -> MuscleListObject? in
    if category.strMuscleName.range(of: query, options: [.caseInsensitive]) != nil {
        return category
    } else {
        let filteredItems = category.arrMuscleExercise.filter({ $0.strExerciseName.range(of: query, options: [.caseInsensitive]) != nil  })
        if filteredItems.isEmpty {
            return nil
        } else {
            var newCategory = category
            newCategory.arrMuscleExercise = filteredItems
            return newCategory
        }
    }
}
print(arrExercise)
print(arrSearchedMuscle)

enter image description here

...