【问题标题】:CoreData extension: insert NSManagedObject in NSManagedObjectContextCoreData 扩展:在 NSManagedObjectContext 中插入 NSManagedObject
【发布时间】:2020-05-04 13:25:48
【问题描述】:

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


        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也会相应改变。

这种方法有任何潜在的限制吗?

【问题讨论】:

    标签: ios swift core-data nsmanagedobject nsmanagedobjectcontext


    【解决方案1】:

    为什么不使用

    let device = Device(context: context)
    

    出于这个确切原因,iOS10 中添加了什么?

    【讨论】:

    • 感谢您的回答。显然,我使用的应用程序的最低支持版本是 iOS 9。正确的解决方案是增加支持的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多