【问题标题】:Swift array cannot be downcast to array of derived [duplicate]Swift数组不能向下转换为派生数组[重复]
【发布时间】:2014-07-24 06:19:40
【问题描述】:

我在 Swift 中使用 Core Data,但无法存储从 fetch 请求返回的数组。我的数据模型中有两个实体:任务和作业。作业的父实体是任务。我为这两个实体自动生成了类:

Task.swift

import Foundation
import CoreData

class Task: NSManagedObject {

    @NSManaged var name: String
    @NSManaged var due: NSDate
    @NSManaged var subject: Subject

}

Homework.swift

import Foundation
import CoreData

class Homework: Task {
}

在我的视图控制器中,视图确实加载了,我有以下代码。

var error: NSError? = nil
let fetchRequest = NSFetchRequest()
let entity = NSEntityDescription.entityForName("Task", inManagedObjectContext: managedObjectContext)
fetchRequest.entity = entity
tasks = managedObjectContext.executeFetchRequest(fetchRequest, error: &error) as [Task]

之前在视图控制器中,我初始化了任务:

var tasks : [Task] = []

但是,当我运行应用程序时,我在将数组分配给任务的那一行出现以下运行时错误:fatal error: array cannot be downcast to array of derived

如果我将赋值行替换为var temp = managedObjectContext.executeFetchRequest(fetchRequest, error: &error) as [NSManagedObject],则不会发生错误,但我需要将其保存为任务数组,以便能够使用我生成的自定义类。我做错了什么?

【问题讨论】:

标签: core-data swift xcode6


【解决方案1】:

您必须在模型编辑器中将模块或应用名称添加到类名称中:

MyApp.Task

这必须在您生成类文件之后进行,否则该部分会失败。我认为这是当前测试版中的一个错误,因此提出了它。

我之前的回答说要使用 @objc 装饰器,它也可以工作,但上述解决方案记录在 swift / cocoa 参考中。

【讨论】:

  • 根据developer.apple.com/library/prerelease/mac/documentation/Swift/…,正确的解决方案是在实体类中包含模块/应用程序名称(然后它可以在没有@objc(Task) 的情况下工作,至少在我的测试中)。当然 Xcode 在自动创建托管对象子类时应该这样做。
  • @MartinR 哦,很有趣。这是文档中的新内容还是我一直都在错过它?从 NSManagedObject 类引用中指向它会很好......
  • 我不知道,但是 Ben 对重复问题的回答是从 6 月 11 日开始的,所以我假设它已经记录了一段时间。
  • 好的,谢谢。我已将我的错误报告更新为文档修复,并由生成器将模块名称添加到类中。
【解决方案2】:

根据 XCode Release Notes for Beta 4,downcast 现在应该可以工作了:

类类型的对象,例如 NSObject 或 NSArray,现在可以向下转换为桥接 Swift 类型。

(虽然没试过)

但是,您可以在需要时将对象投射到任务数组中:

tasks = managedObjectContext.executeFetchRequest(fetchRequest, error: &error)  // array of NSManagedObjects

for obj in tasks {
    let task = obj as Task
    ...
}

【讨论】:

    猜你喜欢
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多