静态方法中的Swift初始化Self

静态方法中的Swift初始化Self,swift,Swift,在User.providedInstance内部,无法初始化Self并返回,使其正常工作时出现问题。有什么想法吗 extension NSManagedObject { public convenience init(managedObjectContext: NSManagedObjectContext) { let entity = NSEntityDescription.entityForName(String(self.dynamicType), inManage

在User.providedInstance内部,无法初始化Self并返回,使其正常工作时出现问题。有什么想法吗

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)

使用元类型值构造类类型为Self的对象必须使用必需的初始值设定项


正如错误所说,您需要一个必需的初始值设定项来创建一个对象,以防您创建子类。在上课前添加
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)
    }
}
@objc(User)公共类用户:NSManagedObject,可反序列化{
私有静态func pInstance(json:[NSObject:AnyObject])->T{
让context=DIContainer.instance.resolve(CoreDataStack.self).managedObjectContext
让复制:NSManagedObject=NSManagedObject(managedObjectContext:context)
让实例=复制为!T
返回实例
}
public static func providedInstance(json:[NSObject:AnyObject])->Self{
返回pInstance(json)
}
}

基本上,创建一个helper函数来基于基类NSManagedObject创建T的实例。然后将其用于实际的
providedinstance
函数和推断的类型Self。

为什么要麻烦初始化器呢

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
    }
}

初始值设定项的问题是,除非它们是
必需的
,否则它们并不总是被继承的。您不能在扩展中创建
必需的
初始值设定项。

您遇到了什么错误?@jtbandes更新的问题和包含的错误如果我添加final,这意味着我将无法再创建用户的子类。这与我发布的有什么不同吗?我没有强制转换。