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' 的下标。