【发布时间】:2015-07-10 09:43:07
【问题描述】:
我目前正在使用 Swift 开发一个 iOS 项目,并且正在尝试使用 Swift 泛型和协议在 NSManagedObjectContext 之上构建某种扩展。我已经实现了一些方法,如下所示:
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
}
}
这个方法很好用,但是当我想实现一个 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"])
然而,最奇怪的是,这个问题的第一种方法效果很好。此外,当我从 upsert 函数中删除 JSON: 参数时,它不会给出该错误并且编译和运行完全正常。
谁能告诉我这是怎么回事?
【问题讨论】:
-
我无法解释为什么,但如果你写 upsert(Person.self ... 我会编译。可能值得一试。
-
嗯确实可以编译,奇怪的是所有其他方法都可以在没有 .self 的情况下工作。我会检查我是否可以提交雷达。谢谢!