Swift在静态方法中初始化自我

问题描述:

在使用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

为什么要用初始值设定项吗?

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

正如错误所说,你需要一个必要的初始化创建一个对象,使你成为子类。在课前添加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修复,它应该现在工作。 –