繁体   English   中英

executeFetchRequest抛出致命错误:NSArray元素无法匹配Swift数组元素类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM