Расширение CoreData: вставьте NSManagedObject в NSManagedObjectContext - PullRequest
0 голосов
/ 17 января 2020

Обычно, когда мне нужно вставить новый объект в NSManagedObjectContext CoreData, я должен сделать это следующим образом:


        let device = NSEntityDescription.insertNewObject(forEntityName: "Device", into: context) as! Device
        device. .....// call methods on "device"

Однако это делает процесс подверженным ошибкам, так как Возвращаемый тип .insertNewObject(forEntityName: не является типобезопасным и требует принудительного приведения. Кроме того, параметр entityName не будет выбран, если класс будет подвергнут рефакторингу, что делает его потенциальным источником ошибок времени выполнения, которые действительно трудно отследить.

Мне интересно использовать более тип- безопасный подход, который минимизирует риск ошибки программиста, например, путем введения следующего расширения для всего модуля Swift:

import CoreData

extension NSManagedObject {
    class func insert(in context: NSManagedObjectContext) -> Self {
        return NSEntityDescription.insertNewObject(forEntityName: String(describing: self), into: context) as! Self
    }
}

После введения этого расширения код на сайте вызова выглядит следующим образом:

        let device = Device.insert(in: context)
        device. .....// call methods on "device"

Если класс Device будет переименован, параметр метода entityName также будет соответствующим образом изменен.

Существуют ли потенциальные ограничения этого подхода?

1 Ответ

2 голосов
/ 17 января 2020

Почему бы не использовать

let device = Device(context: context)

Что было добавлено в iOS10 именно по этой причине?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...