CoreData 扩展:在 NSManagedObjectContext 中插入 NSManagedObject

CoreData extension: insert NSManagedObject in NSManagedObjectContext

通常,当我需要向 CoreData 的 NSManagedObjectContext 中插入一个新对象时,我必须按以下方式进行:


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

但是,由于 .insertNewObject(forEntityName: 的 return 类型不是类型安全的并且需要强制转换,因此它使过程容易出错。此外,如果 class 将被重构,则不会获取 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 class 重命名,方法参数 entityName 也将相应更改。

这种方法有什么潜在的局限性吗?

为什么不使用

let device = Device(context: context)

在 iOS10 中添加了哪个正是出于这个原因?