2016-06-11 77 views
1

在使用User.provideInstance時出現問題,我無法初始化Self並返回。有什麼想法嗎?Swift在靜態方法中初始化自我

extension NSManagedObject { 
    public convenience init(managedObjectContext: NSManagedObjectContext) { 
     let entity = NSEntityDescription.entityForName(String(self.dynamicType), inManagedObjectContext: managedObjectContext)! 
     self.init(entity: entity, insertIntoManagedObjectContext: managedObjectContext) 
    } 
} 

public protocol Deserializable { 
    static func provideInstance(json: [NSObject: AnyObject]) -> Self 
} 

@objc(User) public class User: NSManagedObject, Deserializable { 

    public static func provideInstance(json: [NSObject: AnyObject]) -> Self { 
     let context = DIContainer.instance.resolve(CoreDataStack.self).managedObjectContext 
     let instance = self.init(managedObjectContext: context) 
     return instance 
    } 
} 

錯誤是let instance = self.init(managedObjectContext: context)

構建具有元類型值類型自我的對象必須使用需要初始化

+0

你會得到什麼錯誤? – jtbandes

+0

@jtbandes更新的問題,幷包含錯誤 – aryaxt

回答

1

爲什麼要用初始值設定項嗎?

extension NSManagedObject { 
    class func provide(managedObjectContext managedObjectContext: NSManagedObjectContext) -> Self { 
     let entity = NSEntityDescription.entityForName(String(self.dynamicType), inManagedObjectContext: managedObjectContext)! 
     return self.init(entity: entity, insertIntoManagedObjectContext: managedObjectContext) 
    } 
} 

public protocol Deserializable { 
    static func provideInstance(json: [NSObject: AnyObject]) -> Self 
} 

@objc(User) public class User: NSManagedObject, Deserializable { 

    public static func provideInstance(json: [NSObject: AnyObject]) -> Self { 
     let context = ... 
     let instance = self.provide(managedObjectContext: context) 
     return instance 
    } 
} 

初始化程序的問題是它們並不總是被繼承,除非它們是required。並且您不能在擴展中創建required初始值設定項。

+0

這與我發佈的內容有什麼不同? –

+1

我沒有強制施法。 – Sulthan

1

正如錯誤所說,你需要一個必要的初始化創建一個對象,使你成爲子類。在課前添加final以防止出現此錯誤。

試試這個,如果你需要子類:

@objc(User) public class User: NSManagedObject, Deserializable { 

private static func pInstance<T>(json: [NSObject: AnyObject]) -> T { 
    let context = DIContainer.instance.resolve(CoreDataStack.self).managedObjectContext 
    let copy: NSManagedObject = NSManagedObject(managedObjectContext: context) 
    let instance = copy as! T 
    return instance 
} 

public static func provideInstance(json: [NSObject: AnyObject]) -> Self { 
     return pInstance(json) 
    } 
} 

基本上,創建一個輔助函數來創建基於基類,NSManagedObject T的實例。然後用它推導出類型爲Self的實際provideInstance函數。

+0

如果我添加最終它意味着我將無法創建用戶的子類 – aryaxt

+0

@aryaxt修復,它應該現在工作。 –