使用Swift

时间:2017-11-02 19:47:16

标签: swift core-data

我整个下午都在苦苦挣扎。我可以在睡梦中用Obj-C做到这一点,但我似乎无法理解我在Swift中应该做的事情。我可以得到一个实体数组(StoredTopic),但我一直在尝试访问它们时遇到错误。

这里是获取代码:

func fetchCoreData(_ entityName:String) -> [NSManagedObject] {

    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return []
    }

    let managedContext =
        appDelegate.persistentContainer.viewContext

    let fetchRequest =
        NSFetchRequest<NSManagedObject>(entityName: entityName)

    do {

        let arrData = try managedContext.fetch(fetchRequest)


    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }

    return []
}

这里是arrData的日志

[<StoredTopic: 0x6040000833e0> (entity: StoredTopic; id: 0xd000000000040000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p1> ; data: <fault>), <StoredTopic: 0x604000085960> (entity: StoredTopic; id: 0xd000000000080000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p2> ; data: <fault>), <StoredTopic: 0x604000083020> (entity: StoredTopic; id: 0xd0000000000c0000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p3> ; data: <fault>), <StoredTopic: 0x604000088de0> (entity: StoredTopic; id: 0xd000000000100000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p4> ; data: <fault>), <StoredTopic: 0x60000008c580> (entity: StoredTopic; id: 0xd000000000140000 <x-coredata://C27694CF-4EB0-4F28-8D7D-4DFFAA1051A4/StoredTopic/p5> ; data: {
createDt = "2017-11-02 19:28:00 +0000";
segObj = 0;
segTopic = 0;
title = Test;
topicID = "4A55582B-3084-4ECA-8F61-C1193A85B45B";
"topic_desc" = 1234567890;
updateDt = "2017-11-02 19:28:00 +0000";

所以,如果我尝试做类似的事情:

arrData [0] .topicID我得到&#34;类型&#39; NSManagedObject&#39;没有会员&#39; topicID&#39;&#34;

如果我尝试通过添加此行来建议其他SO帖子:

var arrStoredTopic = [StoredTopic]()
arrStoredTopic = try managedContext.fetch(fetchRequest)

我得&#34;无法分配类型&#39; [NSManagedObject]&#39;输入&#39; [StoredTopic]&#39;&#34;

然后我尝试按照本教程进行操作,虽然它对某些调用有点过时,并改变了我的代码来跟随它:

func fetchCoreData(_ entityName:String) -> [NSManagedObject] {

    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return []
    }

    let managedContext = appDelegate.persistentContainer.viewContext
    var fetchRequest = NSFetchRequest<NSFetchRequestResult>()
    let entityDescription = NSEntityDescription.entity(forEntityName: entityName, in: managedContext)
    fetchRequest.entity = entityDescription

    do {

        //let arrData = try managedContext.fetch(fetchRequest)
        let results = try managedContext.fetch(fetchRequest)

        if results.count > 0 {

            let storedData = results[0] as! NSManagedObject

        }

    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }

    return []
}

仍然无法访问StoredTopic属性。

那么如何从Core Data中获取managedObjects以便我可以使用它们呢?我显然很困惑。

由于

1 个答案:

答案 0 :(得分:1)

更改

let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entityName)

let fetchRequest = NSFetchRequest<StoredTopic>(entityName: entityName)

let fetchRequest = StoredTopic.fetchRequest()

在您的原始代码中,您说获取请求将获取NSManagedObject而不是StoredTopic s,这就是您在访问属性和将获取请求的结果分配给{时遇到问题的原因{1}}。

Swift是一种类型安全的语言,所以它对Objective-C不担心的事情非常严格(直到它在运行时崩溃)。