ios - 使用 Swift 泛型创建新的 NSManagedObjects

标签 ios swift generics core-data swift4

所以,我想在 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"

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

Type 'T' has no member 'entityName'

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

Generic parameter 'T' could not be inferred

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

由“User.create()”创建的“User”类型的“NSManagedObject”缺少什么?

最佳答案

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

class func create<T: NSManagedObject>() -> T {
   ...
}

let employee: User = User.create()
employee.name = "The Dude"

关于ios - 使用 Swift 泛型创建新的 NSManagedObjects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50757740/

相关文章:

ios - 没有互联网连接时禁用按钮

ios - iBeacon 是专有的吗?

c# - 在不知道类型的情况下返回泛​​型

java - 我应该如何将这个变量 E 传递给这个类?自定义序列化器 GSON

objective-c - 检测 UIWebView 中的文本突出显示

ios - postman 响应正常,但在 Swift 3 上的 Alamofire 返回失败

arrays - Swift 是否提供任何内置函数来返回附加到不可变数组的结果?

ios - 旧设备上的异步 DispatchQoS.QoSClass.background

swift - 导航后退按钮返回 View Controller

java - 编写一个通用方法来对一组任意类型的可比较对象进行排序