Как извлечь ключевой ключ атрибута данных из свойства NSManagedObject? - PullRequest
0 голосов
/ 17 апреля 2019

Есть ли способ получить ключ атрибута объекта Базовые данные непосредственно из свойства соответствующего NSManagedObject?Это исключило бы необходимость полагаться на строковый («строково-типизированный») код для некоторых ситуаций, тем самым уменьшая риск ошибки.

Например, я хотел бы заменить следующее:

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "createdDate", ascending: false)]

... с чем-то вроде этого:

fetchRequest.sortDescriptors = [NSSortDescriptor(key: exampleNSManagedObject.createdDate.key, ascending: false)]

Я знаю, что .defaultSortDescriptors может быть использовано для достижения некоторых из этого, но только для фиксированного атрибута.Я также знаю, что .entity.attributesByName.keys можно использовать для получения списка ключей, но я не нашел способа автоматически изолировать соответствующий.

Ответы [ 2 ]

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

Является ли строковое выражение #keyPath тем, что вы ищете?Из документов :

Вы используете строковое выражение #keyPath для создания проверенных компилятором ключей и путей ключей, которые могут использоваться методами KVC

Например:

fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(ExampleNSManagedObject.createdDate), ascending: false)]

0 голосов
/ 17 апреля 2019

Ну, конечно, вы могли бы написать расширение к NSManagedObject, содержащее функцию, которая бы взяла написанную человеком строку и вернула бы лучшее совпадение среди .entity.attributesByName.keys, и это решило бы проблему, как вы ее сформулировали.

Но лучше всего использовать инструмент, который будет автоматически генерировать такие ключевые константы из вашей модели данных. Проверьте mogenerator , открытую «про» замену для генерации кода Core Data, которая встроена в Xcode. Среди его особенностей - создание перечисления для каждого объекта:

public enum MyEntityAttributes: String {
    case createdDate = "createdDate"
    case foo = "foo"
    case bar = "bar"
}

, а затем к нужной строке ключа можно получить доступ как MyEntityAttributes.foo.

...