Проблема извлечения основных данных в Swift

У меня возникла проблема с получением основных данных (код показан ниже). Я создал новый проект XCode и модель данных с тремя атрибутами username, password и testnumbers. Используя приведенный ниже код, я сохранил в них значения и вывел результат в журнал (нижний правый — это вывод из строки кода println(results), которая закомментирована). Так что я полагаю, что он все правильно сохранил.

Теперь я прокомментировал этот раздел и теперь хочу получить значения, хранящиеся в username, password и testnumbers. Печать result.password, кажется, в порядке с кодом, но в коде при попытке напечатать result.testnumbers и result.username он говорит: «AnyObject» не имеет члена с именем «testnumbers/username»». Я не уверен, что происходит, так как мой предыдущий вывод показал правильное их хранение.

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

Вот код:

import UIKit
import CoreData

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        var appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        var context:NSManagedObjectContext = appDel.managedObjectContext!     

        var newUser = NSEntityDescription.insertNewObjectForEntityForName("Users",
                      inManagedObjectContext: context) as NSManagedObject   

        newUser.setValue("Mark", forKey: "username")
        newUser.setValue("pass", forKey: "password")
        newUser.setValue("12345", forKey: "testnumbers")
        context.save(nil) 

        var request = NSFetchRequest(entityName: "Users")
        request.returnsObjectsAsFaults = false
        var results = context.executeFetchRequest(request, error: nil)

        if results?.count > 0 {
            for result: AnyObject in results! {
                //println(results) // this printed everything fine
                println(result.password)
                println(result.testnumbers)
                println(result.username)
            }
        }
    }
}

Вот вывод того, что дает мне первый println(results):

Необязательно([ (сущность: Пользователи; id: 0xd000000000040000; данные: {пароль = пройти; testnumbers = 12345; имя пользователя = Марк; }), (сущность: Пользователи; id: 0xd000000000080000; данные: {пароль = пройти; testnumbers = 12345; username = Mark; }), (entity: Users; id: 0xd0000000000c0000; data: {password = pass; testnumbers = 12345; username = Mark; })])

Фактический скриншот XCode:

Фактический скриншот XCode


person CodeMark22    schedule 06.04.2015    source источник


Ответы (1)


Ваша проблема в том, что context.executeFetchRequest возвращает массив AnyObject?. Когда вы перебираете объекты, это AnyObject?, которые, как говорит Xcode, не имеют свойств testnumber, username или password.

Чтобы решить эту проблему и получить доступ к свойствам с точечной нотацией, вам необходимо создать подклассы для ваших объектов:

1. Выберите свою модель данных (файл .xcdatamodel) и выберите по крайней мере один из ваших объектов. Затем перейдите в «Редактор» -> «Создать подкласс NSManagedObject...», как показано на рисунке.

введите здесь описание изображения

Xcode проведет вас через создание подклассов. (Просто нажмите «Далее» и выберите все объекты, для которых вы хотите создать подклассы — возможно, все)

2. Теперь у вас есть файлы .m и .h для ваших управляемых объектов. В файле .h вы должны увидеть свойства для каждого атрибута и отношения. Вы можете использовать эти свойства для доступа к значениям, хранящимся в CoreData.

Примечание. «Создать подкласс ManagedObject; создает файлы Objective-C, поэтому .h и .m. Поскольку вы используете Swift, вам необходимо включить файлы .h в заголовок моста, например. #include "User.h". Если у вас еще нет связующего заголовка, Xcode должен спросить, хотите ли вы его создать. В противном случае взгляните на эту ссылку: https://bohemianpolymorph.wordpress.com/2014/07/11/manually-adding-a-swift-bridging-header/

3. Теперь, когда вы используете context.executeFetchRequest и получаете свои объекты, вы должны привести их к любому ожидаемому объекту, а затем вы можете получить доступ к их свойствам. Вот пример:

let results = context.executeFetchRequest(request, nil)
if let user = results.first? as? User { // User is an NSManagedObject Subclass
    // Now you can access the properties, e.g:
    println(user.username)
}
person ABakerSmith    schedule 06.04.2015