2014-10-03 4 views
2

Я использую Core Data для определения моей модели.Альтернатива Core Data

1. Невозможно создать объекты на лету.

Я хочу, чтобы создать объект, как показано ниже, и продолжать добавлять значения к его свойствам.

let action = Action() 
action.desc = "hello" 

Но если вы используете классы базовой модели данных, вы не можете сделать это, потому что вы получите ошибку Failed вызвать назначенный инициализатору на NSManagedObject класса. Вы должны создать новые объекты, используя initWithEntity:insertIntoManagedObjectContext: и все.

2. Нельзя использовать тип класса как возвращаемый тип функций.

При использовании основных данных я сохраняю отдельный файл, чтобы поместить все методы выбора/сохранения. В нем у меня есть метод, который использовался для извлечения всех объектов Action в виде массива.

public func loadActions() -> [Action] { 
    let fetchRequest = NSFetchRequest() 
    let entityDescription = NSEntityDescription.entityForName("Action", inManagedObjectContext: managedObjectContext!) 
    fetchRequest.entity = entityDescription 

    var error: NSError? 
    let result = managedObjectContext?.executeFetchRequest(fetchRequest, error: &error) 

    return result! 
} 

Я не могу использовать тип Action для создания типизированного массива, потому что я получаю метод ошибки не могут быть объявлены общественности, поскольку его результат использует внутренний тип. Поэтому я должен получить массив как массив AnyObject s, а затем отбросить их до Action всякий раз, когда я должен их использовать.

3. Невозможно иметь методы в классе.

Я знаю, что вы могли бы создать категории в Objective-C и поместить в него все методы. Я думаю, что эквивалент в Swift - это расширения (?). Но было бы неплохо, если бы у вас был класс и его методы в одном месте.

Скажем, я беру дорогу OO и создаю свою модель полностью, и это приводит к моему вопросу. Как и где я могу сохранить эти объекты?

ответ

0

Это не совсем ответ, но я не думаю, что баллы 2 и 3 действительны?

  1. Не делайте ваш метод общедоступным - проблема здесь не имеет ничего общего с основными данными, это связано с уровнями доступа Swift. Вы не можете сделать общедоступный метод loadActions, который возвращает внутренний тип Action. Вам нужно либо сделать Action общедоступным, либо сделать метод внутренним (т. Е. Удалить слово public)

  2. У вас могут быть методы в классе - просто напишите их там? И даже если вам нужно использовать расширение, вы все равно можете поместить его в один файл?

PS Если вы нашли хорошую альтернативу Swift, сообщите мне. Я ищу один в данный момент - вот как я нашел ваш вопрос в первую очередь!