Я тестирую swift с помощью CoreData, и я создал следующий код:
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 = "[email protected]"
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 type '[AnyObject]?' to type 'NSArray'
Что я делаю неправильно?
Я использую: Xcode 6.0 (6A313) GM и OSX 10.9.4
Update:
-----------
Если я получаю 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. Существует несколько разных причин, почему это происходит, и все они сосредоточены на "Core Data не могут найти класс, который вы указали для этого объекта в строке класса в модели данных".
Среди возможностей:
- Вы указали неверный пакет для своего класса Swift
- Вы забыли указать класс
- Вы неправильно написали имя
В моем случае я забыл указать класс, как показывает POB в ее ответе.