jestem testowania Swift z CoreData i stworzyłem następujący kod:executeFetchRequest rzut błąd krytyczny: Element NSArray udało się dopasować Swift Array typ elementu
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)")
}
}
Kiedy biegnę:
Contact.execute()
Następnie kompilator rzuci ten błąd:
fatal error: NSArray element failed to match the Swift Array Element type
kiedy próbuję uzyskać wartości z tablicy:
let firstContact = result[0] as Contact
Zgaduję, że problem występuje w executeFetchRequest
. Na Objective-c typem zwrotu executeFetchRequest
jest NSArray
. Teraz na Swift typem zwrotu jest [AnyObject]?
.
Próbowałem rzucić wynik [AnyObject]?
do NSArray
, ale Xcode powiedział:
Cannot convert the expression's type '[AnyObject]?' to type 'NSArray'
Co robię źle?
Używam: Xcode 6.0 (6A313) GM i OSX 10.9.4
Aktualizacja:
-----------
Jeśli Otrzymuję executeFetchRequest
wynik jako opcjonalna tablica i używam [NSManagedObject]
zamiast [Contact]
to działa.
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:
-----------
Tego rodzaju problem występuje, gdy instancje jednostka nie ładowane przy użyciu klasę NSManagedObject. Istnieje kilka różnych powodów, dla których tak się dzieje, a wszystkie koncentrują się na tym, że "Dane podstawowe nie mogą znaleźć klasy określonej dla tej jednostki na linii klasy w modelu danych".
Wśród możliwości:
- Podałeś niewłaściwy pakiet dla Swift klasy
- Zapomniałaś, aby określić klasę
- literówka nazwę
W moim przypadku był zapomniałem określić klasę jak pokazuje POB w swojej odpowiedzi.
Dlaczego ustawić '' -execute: metoda, która wykonuje a 'NSFetchRequest' w twojej klasie' NSManagedObject'subclass? –
Zrobiłem to dla prostoty. Łatwy sposób na pokazanie problemu tutaj. – Sebastian
Czy próbowałeś użyć 'let contact = NSEntityDescription.insertNewObjectForEntityForName (" Contact ", inManagedObjectContext: context) jako Contact' zamiast 'let contact = Contact (entity: entityDescripition !, insertIntoManagedObjectContext: context)'? –