#swift #core-data #initialization
Вопрос:
Я пытаюсь понять синтаксис инициализаторов и то, как они работают. Я читаю документацию swift, и мне трудно понять, как они работают в конкретном примере, над которым я работаю. Я следую учебнику, чтобы узнать об основных данных, но я не хочу продолжать работу над проектом, пока не пойму, как работает код инициализации (или любая другая концепция, которую я не понимаю).
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
Основные данные: Обратите Внимание На Класс сущности
Основные данные: Примечание Инициализатор Удобства класса
На первом изображении выше я показываю класс сущностей Note, который создает Core Data, а на втором изображении я добавляю удобную инициализацию(). Все дополнительные сведения о коде в расширении класса заметок-это мои заметки.
Первые два комментария о расширении класса заметок-это то, что я узнал об иерархии классов сущностей, которая заключается в том, что суперкласс-это NSMangedObject (суперкласс), а подкласс-это класс сущностей заметок. Насколько я понимаю, класс NSMangedObject имеет 3 инициализатора, которые:
- init() — Инициализатор по умолчанию
- инициализация(сущность: NSEntityDescription, Вставка в контекст: NSManagedObjectContext?) — Назначенный инициализатор
- удобство инициализации(контекст moc: NSManagedObjectContext) — Инициализатор удобства
Затем обратите внимание на класс сущности, единственное, что у меня есть, — это удобство инициализации(заголовок: Строка, контекст: NSManagedObjectContext). Для этого инициализатора я понимаю, как инициализируются заголовок и дата создания, но мой вопрос касается self.init(контекст: контекст).
Вопрос: Насколько я понимаю, читая документацию Swift, инициализатор удобства не может указывать на другой инициализатор удобства, который, как я думаю, происходит здесь?? Я думаю, что инициализатор по умолчанию из класса Note указывает на инициализаторы из суперкласса NSMangedObject. Может ли кто-нибудь дать мне некоторое представление, чтобы понять, что происходит.
Комментарии:
1. Пожалуйста, опубликуйте код в виде текста , а не в виде изображений.
2. Вы явно недостаточно внимательно прочитали документацию, которую связали. См. правило 2 в этом разделе . «Инициализатор удобства должен вызывать другой инициализатор из того же класса». Не обязательно быть назначенным.
3. Спасибо вам за вашу помощь
Ответ №1:
- Инициализатор удобства должен вызвать другой инициализатор
self
. Это все, что от него требуется. Он должен сделать это, прежде чем говоритьself
о какой-либо другой цели. - В расширении узла это делает инициализатор удобства; он начинается с вызова
self.init(context:)
. - Это законно, потому что узел является подклассом NSManagedObject (представляющим сущность), поэтому он наследует этот инициализатор:
https://developer.apple.com/documentation/coredata/nsmanagedobject/1640602-init
Это все, что нужно знать. Тот факт, что init(context:)
это удобный инициализатор, не интересен. Это инициализатор self
, вот и все, что имеет значение.
Комментарии:
1. Спасибо! Теперь это имеет смысл.