I'm testing swift with CoreData and I created the following code:
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)")
}
}
When I run:
Contact.execute()
Then the compiler throw this error:
fatal error: NSArray element failed to match the Swift Array Element type
when I try to get values from array:
let firstContact = result[0] as Contact
I guess the problem is in executeFetchRequest
. On Objective-c the return type of executeFetchRequest
is a NSArray
. Now on Swift the return type is a [AnyObject]?
.
I tried to cast the [AnyObject]?
result to NSArray
, but Xcode said:
Cannot convert the expression's type '[AnyObject]?' to type 'NSArray'
What I'm doing wrong ?
I'm using:
Xcode 6.0 (6A313) GM and
OSX 10.9.4
Update:
-----------
If I get executeFetchRequest
result as an optional array and use [NSManagedObject]
instead of [Contact]
it works.
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:
-----------
This kind of problem occurs when entity instances didn't get loaded using your NSManagedObject class. There are a few different reasons why that happens, all of which focus on "Core Data couldn't find the class you specified for that entity on the class line in the data model."
Among the possibilities:
- You specified the wrong package for your Swift class
- You forgot to specify the class
- You misspelled the name
In my case was I forgot to specify the class as POB shows in her answer.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…