Что делает @NSManaged?
Я встречал это ключевое слово в разных случаях. Я знаю, что он должен делать. Но я действительно хочу лучше понять это.
Что я заметил о @NSManaged
- основанный не на документации, а на повторном использовании:
- Он волшебным образом заменяет кодирование ключевых значений.
- Это примерно эквивалентно
@dynamic
в Objective-C (о котором я мало что знаю)
- Мне нужно это для подкласса
PFObject
из Parse SDK
. Обычно он использует KVC для чтения/записи значений из/в бэкэнд.
- Префикс любой переменной с
@NSManaged
закроет компилятор, когда я не инициализирую инициализатор.
Формальное определение (в Документах Apple Core Data):
Core Data предоставляет базовое хранилище и реализацию свойств в подклассах класса NSManagedObject. Добавьте атрибут @NSManaged перед каждым определением свойства в подклассе управляемого объекта, который соответствует атрибуту или отношениям в вашей модели данных ядра. Как и атрибут @dynamic в Objective-C, атрибут @NSManaged информирует компилятор Swift о том, что хранение и реализация свойства будут предоставлены во время выполнения. Однако, в отличие от @dynamic, атрибут @NSManaged доступен только для поддержки Core Data.
Что я получил от этого:
Переменные с @NSManaged
должны быть исключены из проверки времени компиляции.
Я прочитал официальную документацию и другие другие вопросы по этому вопросу:
@synthesize vs @dynamic, каковы различия?
Что общего для использования @dynamic?
Я инстинктивно узнаю некоторые сценарии, где я должен его использовать. Я частично знаю, что он делает. Но я ищу более четкое понимание того, что он делает.
Дальнейшие наблюдения:
A PFObject
в Parse SDK
полагается на Key Value Coding
для доступа к своим значениям. PFObject
предоставляет следующие аксессоры:
objectForKey:
let score = results.objectForKey("descriptionOfResult")
//returns the descriptionOfResult value from the results object
setObject:forKey:
results.setObject("The results for a physics exam", forKey: "descriptionOfResult")
//sets the value of descriptionOfResult
Насколько я понимаю, @NSManaged
волшебно понимает, что объявленная переменная автоматически использует вышеуказанные аксессоры к get
и set
. Я хотел бы знать, как он это делает (если я понимаю, это правда) и все, что он делает.
Ответы
Ответ 1
Да, он действительно действует как @dynamic - технически он может быть идентичным даже. Семантически существует небольшая разница:
@dynamic говорит 'компилятор, не проверяйте, реализованы ли мои свойства. Не может быть никакого кода, который вы можете видеть, но я гарантирую, что он будет работать во время выполнения '
@NSManaged теперь говорит "компилятор", не проверяйте эти свойства, поскольку у меня есть Core Data, чтобы позаботиться о реализации - он будет присутствовать во время выполнения
чтобы вы могли даже сказать: @NSManaged - синтаксический сахар, который является более узкой версией динамического:)
https://github.com/KyoheiG3/DynamicBlurView/issues/2
здесь кто-то даже использовал @NSManaged без CD, потому что он хотел @динамическое поведение
Ответ 2
В apple docs для пользовательского управляемого класса объектов они приводят пример свойств, например...
Мне кажется, что нет разницы, я использовал @dynamic
в объективе C, кажется, что @NSManaged
является заменой в Swift.
Ответ 3
Вышеупомянутые ответы правильные. Вот мое понимание.
@NSManaged указывает, что переменные получат некоторые значения при запуске приложения. Coredata автоматически создает геттер и сеттер для таких реквизитов. Он отключает компилятор для предупреждений.
NSmanaged является подклассом NSObject.
@NSManaged означает, что дополнительный код будет предоставлен этим реквизитам во время выполнения.
Он отслеживает изменения, внесенные в эти свойства.