Подтвердить что ты не робот

Что делает @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. Я хотел бы знать, как он это делает (если я понимаю, это правда) и все, что он делает.

4b9b3361

Ответ 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 означает, что дополнительный код будет предоставлен этим реквизитам во время выполнения. Он отслеживает изменения, внесенные в эти свойства.