【问题标题】:Swift complains of undeclared type, but that doesn't seem to be the problemSwift 抱怨未声明的类型,但这似乎不是问题
【发布时间】:2019-06-28 21:25:36
【问题描述】:

我正在尝试获取 Core Data 中的记录。

func fetchOrg() {
     var **internalOrganization** = [InternalOrganizationMO]() //NSManagedClass
     let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "InternalOrganization")
     fetchRequest.returnsObjectsAsFaults = false
     do {
          let result = try managedObjectContext.fetch(fetchRequest) as **internalOrganization**  **////Compiler flags Error here**
     } catch {
          fatalError("Failed to fetch internal organization \(error)")
     }
 }

InternalOrganizationMO 是对应于对象模型的 ManagedObject 类,我似乎很清楚 internalOrganization 被声明为这些对象的数组,因此标记的错误似乎已关闭。我的理解是,这种对象应该是 fetch 的目标,但我在这里肯定处于学习曲线上。

是不是 fetch 需要针对 Type 而不是 array - 因此,关于我没有提供命名类型的抱怨?如果是这样,我是否应该提供ManagedObject?如果是这样,我到底如何确定返回了多少条记录?

这真的比只使用 SQLite 的接口更好吗? 谢谢,对不起。

【问题讨论】:

    标签: arrays swift fetch typeerror


    【解决方案1】:

    您将对象类型转换为类型,而不是将对象转换为对象。

    例子:

    let a = b as! [String]
    

    而不是

    let a = [String]()
    let c = b as! a
    

    解决方案 #1:

    更改NSFetchRequest&lt;NSFetchRequestResult&gt; 以将类型明确指定为InternalOrganizationMO,如下所示:

    NSFetchRequestResult<InternalOrganizationMO>
    

    fetchRequest 现在具有正确的关联类型InternalOrganizationMO,并将相应地用于返回此类型的对象。
    然后,您无需再次输入result,以下代码应该可以正常工作:

    func fetchOrg() {
        let fetchRequest = NSFetchRequest<InternalOrganizationMO>(entityName: "InternalOrganization")
    
        do {
            let internalOrganization = try managedContext.fetch(fetchRequest)
            /*
             internalOrganization will be of type [InternalOrganizationMO]
             as that is the return type of the fetch now.
             */
    
            //handle internalOrganization here (within the do block)
    
            print(internalOrganization.count)
        }
        catch {
            fatalError("Failed to fetch internal organization \(error)")
        }
    }
    

    解决方案 #2:

    如果您希望此方法在 fetchRequest 尝试或类型转换失败的情况下也能正常工作,那么您可以这样做:

    func fetchOrg() {
        var internalOrganization = [InternalOrganizationMO]()
    
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "InternalOrganization")
    
        do {
            internalOrganization = try managedContext.fetch(fetchRequest) as? [InternalOrganizationMO]
            /*
             You ofcourse wouldn't want the above optional binding to fail but even if it
             does, atleast your method can stay consistent and continue with an empty array
             */
        }
        catch {
            fatalError("Failed to fetch internal organization \(error)")
        }
    
        //handle internalOrganization here
        print(internalOrganization.count)
    }
    

    解决方案的选择取决于您的设计和要求。

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      相关资源
      最近更新 更多