2016-08-15 3 views
2

я получаю сообщение об ошибке:Тема 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкодовый = 0 * 0) Ошибка

1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0*0)

Я новичок в кодировании и я следую за это видео https://www.youtube.com/watch?v=Fv-A8lKn7VY

Кода выглядит следующим образом:

import UIKit 
import 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{ 


     do { try NSFileManager.defaultManager().createDirectoryAtPath(SwiftCoreDataHelper.directoryForDatabaseFilename() as String, withIntermediateDirectories: true, attributes: nil) } 
     catch { 
      print("Error Creating Directory for DB") 
     } 
     //  NSFileManager.defaultManager().createDirectoryAtPath(SwiftCoreDataHelper.directoryForDatabaseFilename(), 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)! 

     let storeCoordinator:NSPersistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedModel) 

     do { 
     try storeCoordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil) 
     } 
     catch { 
      print("Error: \(error)") 
      } 

     let 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{ 
     do { 
      try managedObjectContext.save() 
      return true 
     } catch _ { 
      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 
     var items = NSArray() 
     do { items = try managedObjectContext .executeFetchRequest(fetchRequest) 
     } catch { 
      print("Fetch Request Failed") 
     } 
     return items 
    } 
} 

код, где генерируется ошибка:

let entetyDescription:NSEntityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext)! 

Я не могу исправить ошибку.

+2

я бы сильно избежать этих учебников которые предлагают типы Foundation ('NSString',' NSDictionary'), а не родные типы Swift ('String',' Dictionary') и 'NSHomeDictionary()', а не '' URLForDirectory: inDomain: соответствующимForURL: create: '' NSFileManager' для укажите каталоги в контейнере приложения. – vadian

+0

Использование методов в 'NSBundle' для получения местоположений каталога - это правильный способ сделать это. –

ответ

0

entityForName возвращает необязательное значение. Это, вероятно, разбился, потому что вы принудительно разворачивать результат этой операции с !

Вы можете использовать дополнительное связывание в этом случае, чтобы проверить, если entityForName фактически возвращает значение:

if let entityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext) { 
    // work with entityDescription 
} else { 
    // handle the case in which entityForName returns nil 
} 
+0

да я сильно надел! в конце 'let entetyDescription: NSEntityDescription = NSEntityDescription.entityForName (className as String, inManagedObjectContext: managedObjectContext)', потому что он показывает, что значение необязательного типа NSEntityDescription? не разворачивается, и появляется всплывающее сообщение! – Radz

+0

Да, компилятор видит ошибку перед запуском и предлагает мгновенное решение. К сожалению, эти решения не всегда целесообразны - как в этом случае. – ff10

+0

да, не могли бы вы предложить мне решение этой ошибки? Я не могу это решить – Radz

Смежные вопросы