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