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