NSEntityDescription возвращает ноль, разворачивая необязательное значение

Вот что происходит: я новичок в Swift и пока не совсем понимаю CoreData, но я следую некоторым учебникам по YouTube, чтобы я мог их изучить. Теперь, когда я запускаю мое приложение, оно падает, а затем выдает ошибку "Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения"

подробно: этот код взят из одного учебного пособия, помогающего новым людям быстро использовать CoreData.

Вот код:

импорт UIKit импорт CoreData

class SwiftCoreDataHelper: NSObject {

class func directoryForDatabaseFilename()->NSString{
    return NSHomeDirectory().stringByAppendingString("/Library/Private Documents")
}


class func databaseFilename()->NSString{
    return "database.sqlite";
}


class func managedObjectContext()->NSManagedObjectContext{

    var error:NSError? = nil

    NSFileManager.defaultManager().createDirectoryAtPath(SwiftCoreDataHelper.directoryForDatabaseFilename() as String, withIntermediateDirectories: true, attributes: nil, error: &error)

    let path:NSString = "\(SwiftCoreDataHelper.directoryForDatabaseFilename()) + \(SwiftCoreDataHelper.databaseFilename())"

    let url:NSURL = NSURL(fileURLWithPath: path as String)!

    let managedModel:NSManagedObjectModel = NSManagedObjectModel.mergedModelFromBundles(nil)!

    var storeCoordinator:NSPersistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedModel)

    if !(storeCoordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error:&error ) != nil){
        if (error != nil){
            println(error!.localizedDescription)
            abort()
        }
    }

    var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)

    managedObjectContext.persistentStoreCoordinator = storeCoordinator

    return managedObjectContext


}

class func insertManagedObject(className:NSString, managedObjectConect:NSManagedObjectContext)->AnyObject{

    let managedObject:NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName(className as String, inManagedObjectContext: managedObjectConect) as! NSManagedObject

    return managedObject

}

class func saveManagedObjectContext(managedObjectContext:NSManagedObjectContext)->Bool{
    if managedObjectContext.save(nil){
        return true
    }else{
        return false
    }
}


class func fetchEntities(className:NSString, withPredicate predicate:NSPredicate?, managedObjectContext:NSManagedObjectContext)->NSArray{
    let fetchRequest:NSFetchRequest = NSFetchRequest()
    let entetyDescription:NSEntityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext)!

    fetchRequest.entity = entetyDescription
    if (predicate != nil){
        fetchRequest.predicate = predicate!
    }

    fetchRequest.returnsObjectsAsFaults = false
    let items:NSArray = managedObjectContext .executeFetchRequest(fetchRequest, error: nil)!

    return items
}

}

Затем он падает прямо здесь:

    **let entetyDescription:NSEntityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext)!** // Crashes right here, "Thead 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)

Что я должен сделать, чтобы исправить эту ошибку? Я в этой теме уже 3 дня и не знаю, куда бежать!

Заранее спасибо.

ОБНОВИТЬ

Вот мой код:

импорт UIKit импорт CoreData

Класс MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var mainImage: UIImageView!
@IBOutlet weak var tableView: UITableView!
var namesListArray:NSMutableArray = NSMutableArray()



override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    loadData()
}

func loadData() {
    namesListArray.removeAllObjects()
    let moc:NSManagedObjectContext = SwiftCoreDataHelper.managedObjectContext()
    let results:NSArray = SwiftCoreDataHelper.fetchEntities(NSStringFromClass(Recipe), withPredicate: nil, managedObjectContext: moc)
    for recipe in results {
        let singleRecipe:Recipe = recipe as! Recipe
        let recipeDict:NSDictionary = ["identifier":singleRecipe.identifier, "recipelabel":singleRecipe.recipelabel, "recipeimage":singleRecipe.recipeimage]
        namesListArray.addObject(recipeDict)
    }
    tableView.reloadData()     }

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return namesListArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:CustomCellTableViewCell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomCellTableViewCell
    let recipeDict:NSDictionary = namesListArray.objectAtIndex(indexPath.row) as! NSDictionary
    let recipeName = recipeDict.objectForKey("recipelabel") as! String
    let imageData:NSData = recipeDict.objectForKey("recipeimage") as! NSData
    let recipeImage: UIImage = UIImage(data: imageData)!
    cell.customLabel.text = recipeName
    var recipeImageFrame:CGRect = cell.customImage.frame
    recipeImageFrame.size = CGSizeMake(75,75)
    cell.customImage.frame = recipeImageFrame
    cell.customImage.image = recipeImage

    return cell
}

}

предикат NSP предикат? нет Нет

Может быть, ошибка здесь? Если так, я не вижу этого. Любая идея?

И еще раз спасибо!!!

2 ответа

Решение

className Передача в наиболее вероятном случае содержит опечатку, поэтому вы не можете извлечь сущность из модели. Сравните то, что передается с тем, что ожидает модель, и вы найдете ошибку.

Обновить

Распечатайте className в этом методе. Что распечатывается? Это соответствует тому, что в модели? Имя класса редко совпадает с именем объекта.

У меня была похожая ошибка. Что сработало для меня, так это то, что в вашей сущности "Рецепт" попробуйте добавить следующее

Класс @objc(Рецепт) Рецепт: NSManagedObject { ... }

Вы подвергаете Рецепт Objective-C. Я использую Xcode 7.3.1.

Еще одна вещь, чтобы проверить. Убедитесь, что в вашем инспекторе моделей данных поле Модуль пустое. Чтобы попасть туда, нажмите на ваш.xcdatamodelId и на правой панели.

Другие вопросы по тегам