Иерархия инициализаторов: Нужна помощь в понимании self.init и того, как он указывает на суперкласс

#swift #core-data #initialization

Вопрос:

Я пытаюсь понять синтаксис инициализаторов и то, как они работают. Я читаю документацию swift, и мне трудно понять, как они работают в конкретном примере, над которым я работаю. Я следую учебнику, чтобы узнать об основных данных, но я не хочу продолжать работу над проектом, пока не пойму, как работает код инициализации (или любая другая концепция, которую я не понимаю).

https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

Основные данные: Обратите Внимание На Класс сущности

Основные данные: Примечание Инициализатор Удобства класса

На первом изображении выше я показываю класс сущностей Note, который создает Core Data, а на втором изображении я добавляю удобную инициализацию(). Все дополнительные сведения о коде в расширении класса заметок-это мои заметки.

Первые два комментария о расширении класса заметок-это то, что я узнал об иерархии классов сущностей, которая заключается в том, что суперкласс-это NSMangedObject (суперкласс), а подкласс-это класс сущностей заметок. Насколько я понимаю, класс NSMangedObject имеет 3 инициализатора, которые:

  1. init() — Инициализатор по умолчанию
  2. инициализация(сущность: NSEntityDescription, Вставка в контекст: NSManagedObjectContext?) — Назначенный инициализатор
  3. удобство инициализации(контекст moc: NSManagedObjectContext) — Инициализатор удобства

Затем обратите внимание на класс сущности, единственное, что у меня есть, — это удобство инициализации(заголовок: Строка, контекст: NSManagedObjectContext). Для этого инициализатора я понимаю, как инициализируются заголовок и дата создания, но мой вопрос касается self.init(контекст: контекст).

Вопрос: Насколько я понимаю, читая документацию Swift, инициализатор удобства не может указывать на другой инициализатор удобства, который, как я думаю, происходит здесь?? Я думаю, что инициализатор по умолчанию из класса Note указывает на инициализаторы из суперкласса NSMangedObject. Может ли кто-нибудь дать мне некоторое представление, чтобы понять, что происходит.

Комментарии:

1. Пожалуйста, опубликуйте код в виде текста , а не в виде изображений.

2. Вы явно недостаточно внимательно прочитали документацию, которую связали. См. правило 2 в этом разделе . «Инициализатор удобства должен вызывать другой инициализатор из того же класса». Не обязательно быть назначенным.

3. Спасибо вам за вашу помощь

Ответ №1:

  1. Инициализатор удобства должен вызвать другой инициализатор self . Это все, что от него требуется. Он должен сделать это, прежде чем говорить self о какой-либо другой цели.
  2. В расширении узла это делает инициализатор удобства; он начинается с вызова self.init(context:) .
  3. Это законно, потому что узел является подклассом NSManagedObject (представляющим сущность), поэтому он наследует этот инициализатор:

    https://developer.apple.com/documentation/coredata/nsmanagedobject/1640602-init

Это все, что нужно знать. Тот факт, что init(context:) это удобный инициализатор, не интересен. Это инициализатор self , вот и все, что имеет значение.

Комментарии:

1. Спасибо! Теперь это имеет смысл.