2016-06-11 3 views
1

Ошибка при работе с этим, внутри User.provideInstance Я не могу инициализировать Self и return. Есть предположения?Быстрое инициализирование 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):

Создание объекта типа класса Самости со значением метатипом должны использовать обязательные для заполнения Initializer

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

В принципе, создать вспомогательную функцию для создания экземпляра T на основе базового класса, NSManagedObject. Затем используйте его фактическую функцию provideInstance с предполагаемым типом Self.

+0

Если я добавлю окончательный, это значит, что я не смогу создать подкласс пользователя больше – aryaxt

+0

@aryaxt Исправлено, он должен работать сейчас. –

Смежные вопросы