我目前正在Swift中的iOS项目上工作,我试图使用Swift泛型和协议在NSManagedObjectContext之上构建某种扩展。我已经执行类似下面的一些方法:NSManagedObjectContext扩展中的泛型函数中的奇怪的Swift行为
extension NSManagedObjectContext {
func objectWhere<T: NSManagedObject>(entityClass: T.Type, predicate: NSPredicate) -> T? {
let entityName = NSStringFromClass(entityClass)
let request = NSFetchRequest(entityName: entityName)
//...fetch object code here
return result?.first
}
}
这种方法效果很好,但trickyness是当我想要实现的UPSERT。基本上我做的是创造一个协议,就像这样:
protocol Updatable {
static func primaryKeyJSON() -> String
static func primaryKey() -> String
func populate(JSON: [NSObject: AnyObject], context: NSManagedObjectContext)
func update(JSON: [NSObject: AnyObject], context: NSManagedObjectContext)
}
接下来我要做的事情就是延长我的NSManagedObject子类本协议中的一个。在我目前的项目中,例如我有一个名为Person的类来实现这个协议。这个协议应该允许我创造在同一的NSManagedObjectContext扩展这样的UPSERT方法:但是
func upsert<T where T: NSManagedObject, T: Updatable>(entityClass: T.Type, JSON: [NSObject: AnyObject]) -> T? {
return nil
}
的问题是,每当我把这种方法Xcode中给出了一个错误说:“式结束后的预计会员名称或构造函数调用名称”。
c.upsert(Person, JSON: ["test": "sometest"])
最奇怪的是,这个问题的第一种方法工作得很好。另外,当我删除JSON:参数形式的upsert函数时,它不会给出该错误并编译并运行得很好。
有人能告诉我发生了什么事吗?
我无法解释为什么,但如果你写的upsert(Person.self ...我会编译,可能值得一个雷达 –
嗯,确实编译,奇怪的是,所有其他方法没有工作,但我会检查是否可以提交雷达。 – Arthur