2015-05-22 5 views
0

Я только что начал Swift и обычно в Objective-C создаю категорию для каждого из моих подклассов NSManagedObject, поэтому категория не стирается каждый раз, когда мне приходится генерировать мой подкласс. Более того, он может упростить создание объектов CoreData, особенно когда они заполняются данными, поступающими из JSON.эквивалент категории подкласса NSManagedObject в Swift?

Пример:

Мой NSManagedObject подкласс:

@class Book; 

@interface Book : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * author; 
@property (nonatomic, retain) NSString * plot; 
@end 

Его "помощник" Реализация категории:

+ (Book*)bookFromDictionary:(NSDictionary *)dictionary inContext:(NSManagedObjectContext *)context { 
    Book *book = nil; 

    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Book"]; 
    request.predicate = [NSPredicate predicateWithFormat:@"name == %@", dictionary[@"name"]]; 
    request.fetchLimit = 1; 

    NSError *error; 
    NSArray *result = [context executeFetchRequest:request error:&error]; 

    if (!result || error) { 
     NSLog(@"Error getting Book : %@", error.localizedDescription); 
    } else if ([result count] == 0) { 
     book = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context]; 
    } else { 
     book = [result lastObject]; 
    } 

    self.name = dictionary[@"name"]; 
    self.author = dictionary[@"author"]; 
    self.plot = dictionary[@"plot"]; 

    return book; 
} 

Я пытаюсь воспроизвести эту концепцию в Swift, но я не Не знаю, как это сделать. Кажется, что расширения заменяют категории в Swift, но если я реализую расширение в подкласс NSManagedObject в Swift, он будет стираться каждый раз, когда мне нужно создать подкласс NSManagedObject (потому что он находится в том же файле ...). Вот почему я использовал категории в Obj-C.

Может ли кто-нибудь сказать мне, что такое хорошие практики в Swift?

Я был бы очень признателен за любую помощь!

+0

Категории - это правильный способ сделать это в ObjC (очевидно, после того, как вы были укушены, но почему не генерируется код шаблона Xcode, который не включает комментарии к этому эффекту?) В Swift я использую расширения. – Grimxn

ответ

2

Быстрое расширение - это правильный способ определения дополнительных методов для подклассов NSManagedObject. Вы можете поместить расширение в отдельный файл (например, «BookExtensions.swift»), чтобы они не были перезаписаны, когда «Book.swift» воссоздан в Xcode.

+1

Прямо сейчас я бы не стал рекомендовать Xcode создавать подклассы. Запустите несколько проблем с nillable свойствами. –

+0

Не позволяя Xcode создавать подклассы, вы вообще не используете файл модели данных? Или мне нужно поддерживать подкласс NSManagedObject программно и в то же время эквивалентный файл модели данных? – Ticko

+0

Другой вопрос (я больше не мог редактировать ...). Является ли mogenerator хорошей альтернативой для решения этой проблемы (все еще в Swift)? – Ticko

0

Есть проблемы с созданием подклассов для NSManagedObjects в Swift. Как правило, вы должны проходить через них вручную вручную, например. Типы изменений в опции, включают в себя маркер, такие как @objc(Class) т.д.

Поэтому я изменил свой рабочий процесс: теперь я в то числе пользовательских методов в сформированном файле без с использованием extension (который является Swift эквивалент категории) , При обновлении моей модели управляемых объектов я просто изменяю файл незначительно, добавляя, переименовывая, изменяя и т.д. атрибуты и отношения.

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