![](/img/trans.png)
[英]fatal error: NSArray element failed to match the Swift Array Element type
[英]executeFetchRequest throw fatal error: NSArray element failed to match the Swift Array Element type
我正在使用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)GM和OSX 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)")
}
UPDATE2:
-----------
当使用NSManagedObject类未加载实体实例时,会发生此类问题。 发生这种情况的原因有几个,所有这些都集中在“核心数据无法找到您在数据模型中的类行上为该实体指定的类”。
其中包括:
- 您为Swift类指定了错误的包
- 你忘了指定课程
- 你错了名字
在我的情况下,我忘记在她的答案中指定课程作为POB显示。
我能够在控制台中重现您的错误消息。 您收到此消息是因为未在Core Data Model Editor中正确设置实体类名称(请参见下图)。
完成后,您将能够将原始代码与Contact
一起使用。 您可以在此处了解有关Core Data和名称空间的更多信息。
我认为它的坏主意,设定目标的名字前缀,像这样因为如果你想你的模型转移到其他应用程序,或更改targer名字,你将最终再次改变它,
所以还有另一种方式。 如果你看看xcode现在如何生成核心数据实体,正如@A_man所说,你需要在编辑器中设置当前模块并使用@objc(),如下所示:
import CoreData
@objc(Contact)
class Contact: NSManagedObject {
@NSManaged var name: String?
@NSManaged var email: String?
}
字段必须是可选的,因为它们可以是零
从Data Model Inspector检查Entity中的类和模块,并将类名称设置为实体名称,将模块设置为“Current Product Module” 类名称和模块
我认为你的问题是executeFetchRequest返回一个可选数组,而不是数组。 你需要打开它。
if let result: [Contact]? = context.executeFetchRequest(fetch, error: nil) as? [Contact] {
let firstContact = result[0]
println("/(firstContact.name)")
println("/(firstContact.email)")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.