2016-08-15 4 views
1

Ошибка использование нераспределенного идентификатора 'entityDescription' идет в моем коде. Даже после того, как многие неудачные попытки не могут его решить.использование неразрешенного идентификатора 'entityDescription'

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() 


    guard let entityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext) else { 
     //handle error here 
     return 
    } 

    fetchRequest.entity = entityDescription 
    if let predicate = predicate { 
     fetchRequest.predicate = predicate 
    } 

    fetchRequest.returnsObjectsAsFaults = false 
    var items = NSArray() 
    do { items = try managedObjectContext .executeFetchRequest(fetchRequest) 
    } catch { 
     print("Fetch Request Failed") 
    } 
    return items}} 

ошибка приходит в code-

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

Я не понимаю где я буду неправильно. Любая помощь приветствуется. Заранее спасибо

+0

На стороне записки: что 'nil' проверить и сила разворачивать будет лучше, как только (' '!):' Если пусть предикат = предикат {fetchRequest.predicate = предикат} ' – Alexander

+0

@AlexanderMomchliov, когда я использую ваше решение, он показывает ** значение типа« NSFetchRequest »не имеет предиката члена ** ** – user6718553

+0

нет, он еще не разрешает – user6718553

ответ

0

В заявлении if let новое имя переменной привязано только на время области if let. Вы не сможете использовать его впоследствии. Что вы после это guard заявление:

guard let entityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext) else { 
    //handle error here 
    return 
} 

fetchRequest.entity = entityDescription 
if let predicate = predicate { 
    fetchRequest.predicate = predicate 
} 
+0

В операторе return появляется всплывающее сообщение, в котором говорится, что ** не-void функция должна возвращать значение "** – user6718553

+0

Операторы' guard' требуют существования области с помощью 'return '/' throw'/'break' /' контин ue'/и т.д.. Я поставил это в качестве заполнителя, учитывая ограниченную информацию, с которой мне приходится работать. Вам нужно будет установить соответствующее значение – Alexander

+1

@ user6718553 У вас есть некоторые основные проблемы с Swift. Вероятно, вы должны проверить [бесплатную документацию Swift для Apple] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097-CH3- ID0), который легко ответил бы на ваши вопросы. –

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