我正在使用 CoreData 测试 swift 并创建了以下代码:
import UIKit
import CoreData
class Contact: NSManagedObject {
@NSManaged var name: String
@NSManaged var email: String
class func execute(){
let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let context:NSManagedObjectContext = appDel.managedObjectContext!
let entityDescripition = NSEntityDescription.entityForName("Contact", inManagedObjectContext: context)
let contact = Contact(entity: entityDescripition!, insertIntoManagedObjectContext: context)
contact.name = "john Apleesee"
contact.email = "john@apple.com"
context.save(nil)
let fetch:NSFetchRequest = NSFetchRequest(entityName: "Contact")
var result = context.executeFetchRequest(fetch, error: nil) as [Contact]
let firstContact = result[0] as Contact // <<-- error !
println("\(firstContact.name)")
println("\(firstContact.email)")
}
}
当我运行时:
Contact.execute()
然后编译器抛出这个错误:
fatal error: NSArray element failed to match the Swift Array Element type
当我尝试从数组中获取值时:
let firstContact = result[0] as Contact
我猜问题出在 executeFetchRequest 中。在 Objective-c 上,executeFetchRequest 的返回类型是 NSArray。现在,在 Swift 上,返回类型是 [AnyObject]?。
我试图将 [AnyObject]? 结果转换为 NSArray,但 Xcode 说:
Cannot convert the expression's type '[AnyObject]?' to type 'NSArray'
我做错了什么?
我正在使用: Xcode 6.0 (6A313) 通用和 操作系统 10.9.4
更新:
------------
如果我得到 executeFetchRequest 结果作为可选数组并使用 [NSManagedObject] 而不是 [Contact] 它会起作用。
if let result: [NSManagedObject]? = context.executeFetchRequest(fetch, error: nil) as? [NSManagedObject] {
let firstContact: NSManagedObject = result![0]
let name = firstContact.valueForKey("name") as String
let email = firstContact.valueForKey("email") as String
println("\(name)")
println("\(email)")
}
更新2:
------------
当没有使用 NSManagedObject 类加载实体实例时,就会出现这种问题。发生这种情况有几个不同的原因,所有这些都集中在“核心数据无法在数据模型的类行上找到您为该实体指定的类。”
其中的可能性:
- 你为你的 Swift 类指定了错误的包
- 你忘了指定类(class)
- 你拼错了名字
就我而言,我忘记指定 POB 在她的回答中显示的类(class)。
最佳答案
我能够在控制台中重现您的错误消息。您收到此消息是因为您没有在核心数据模型编辑器中正确设置您的实体类名称(见下图)。
完成后,您将能够将原始代码用于Contact 子类。您可以了解有关 Core Data 和 namespace 的更多信息 here .
关于ios - executeFetchRequest 抛出 fatal error : NSArray element failed to match the Swift Array Element type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25897122/