我目前正在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