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 中添加了哪个正是出于这个原因?
通常,当我需要向 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 中添加了哪个正是出于这个原因?