Быстрое прохождение ключевого пути в качестве параметра функции - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно иметь возможность передать #keypath в func для фильтрации моих записей CoreData.

Я делаю что-то вроде этого:

func filteredExercises(with propertyKeyPath: #keyPath, filter: Any) {

        do {
            let filteredExercises = try CoreStore.fetchAll(
                From<ExerciseEntity>(),
                Where<ExerciseEntity>("%K = %@", #keyPath(ExerciseEntity.muscle.name), filter)
            )

        } catch {

        }
    }

Но наверняка #keyPath не тип, как это сделать правильно? Или мне нужно подготовить отфильтрованную строку, которую я передам функции, как предикат?

1 Ответ

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

Если вы хотите работать с #keyPath, тогда это просто строка. (Немного безопаснее создать строку, предназначенную для работы с KVC.)

Объявите тип параметра как String, где вы хотите получить #keyPath, и передать его в любое место, где #keyPath принято.

func filteredExercises(with propertyKeyPath: String, filter: Any) {

    do {
        let filteredExercises = try CoreStore.fetchAll(
            From<ExerciseEntity>(),
            Where<ExerciseEntity>("%K = %@", propertyKeyPath, filter)
        )

    } catch {

    }
}

Если вам нужно работать со Swift-native KeyPath, это еще одна проблема.

...