【问题标题】:Swift initialize Self in a static methodsSwift 在静态方法中初始化 Self
【发布时间】:2016-06-11 20:57:14
【问题描述】:

在 User.provideInstance 中无法使其正常工作,我无法初始化 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 的对象必须使用必需的初始化程序

【问题讨论】:

  • 你得到什么错误?
  • @jtbandes 更新问题并包含错误

标签: swift


【解决方案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 初始化器。

【讨论】:

  • 这与我发布的内容有何不同?
  • 我没有强制转换。
【解决方案2】:

正如错误所说,您需要一个必需的初始化程序来创建一个对象,以防您创建子类。在您的课程前添加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 实例。然后将其用于实际的 provideInstance 函数和推断类型 Self。

【讨论】:

  • 如果我添加 final 这意味着我将无法再创建 User 的子类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多