【问题标题】:Using Swift generics to create new NSManagedObjects [duplicate]使用 Swift 泛型创建新的 NSManagedObjects [重复]
【发布时间】:2018-06-08 09:41:19
【问题描述】:

所以,我想在 NSManagedObject 扩展上编写一个通用函数来创建一个新对象。

public extension NSManagedObject {
    class var entityName: String {
        var name = NSStringFromClass(self)
        name = name.components(separatedBy: ".").last!
        return name
    }

    class func create<T>() -> T {
        guard let entityDescription = NSEntityDescription.entity(forEntityName: T.entityName, in: CoreDataManager.tripregi.managedObjectContext) else { fatalError("Unable to create \(T.entityName) NSEntityDescription") }
        guard let object = NSManagedObject(entity: entityDescription, insertInto: CoreDataManager.tripregi.managedObjectContext) as? T else { fatalError("Unable to create \(T.entityName) NSManagedObject")}
        return object
    }
}

当我尝试如下使用它时:

let employee = User.create() //FYI:User is a core data entity
employee.name = "The Dude"

我在扩展程序中收到以下错误

类型“T”没有成员“entityName”

User.create() 部分出现以下错误:

无法推断通用参数“T”

我可以通过在扩展中指定 T:NSManagedObject 来解决这个问题,但是该类不再是 User 类并且不再具有属性名称......

我缺少由“User.create()”创建的“用户”类型的“NSManagedObject”?

【问题讨论】:

    标签: ios swift generics core-data swift4


    【解决方案1】:

    使 T 为 NSManagedObject 类型,并告诉编译器员工是用户

    class func create<T: NSManagedObject>() -> T {
       ...
    }
    
    let employee: User = User.create()
    employee.name = "The Dude"
    

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2013-09-06
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多