Swift数组不能向下转换为派生数组[重复]

Posted

技术标签:

【中文标题】Swift数组不能向下转换为派生数组[重复]【英文标题】:Swift array cannot be downcast to array of derived [duplicate] 【发布时间】: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],则不会发生错误,但我需要将其保存为任务数组,以便能够使用我生成的自定义类。我做错了什么?

【问题讨论】:

比较developer.apple.com/library/prerelease/mac/documentation/Swift/…中的“实现核心数据托管对象子类”。 【参考方案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
    ...

【讨论】:

以上是关于Swift数组不能向下转换为派生数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

访问对象属性(在没有数组转换的情况下向下钻取)[重复]

Swift4.2~数组和字典(Array, Dictionary)基本类型转换

NSMutableArray 到 Swift iOS 的字符串转换数组 [重复]

在 swift 中将 String 类型数组转换为 Float 类型数组 不能将类型 'String' 的值分配给类型 'Double' 的下标。

使用 Swift 3.0 将包含“字符串数组”的字符串解析为数组 [重复]

在 Swift 中浮动的 Uint8 数组 [重复]