2016-11-02 1 views
1

Dans une version antérieure de rapide, j'ai eu une fonction de données de baserapide 3 - entité passe comme argument de fonctionner

func retrieveItemsForRelatedEntity(entity: String, relatedEntity: String, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? { 

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context: NSManagedObjectContext = appDel.managedObjectContext! 
    let frequest = NSFetchRequest(entityName: entity) 
    frequest.returnsObjectsAsFaults = false 

    if sortDescriptors != nil { 
     frequest.sortDescriptors = sortDescriptors 
    } 

    switch relatedEntity { 
    case "CostCentre": 
     frequest.predicate = NSPredicate(format: "costCentre.identifier == '\(identifier)'") 
     return try! context.executeFetchRequest(frequest) 
    case "CostCentreDay": 
     frequest.predicate = NSPredicate(format: "costCentreDay.identifier == '\(identifier)'") 
     return try! context.executeFetchRequest(frequest) 
    case "Resource": 
     frequest.predicate = NSPredicate(format: "resource.identifier == '\(identifier)'") 
     return try! context.executeFetchRequest(frequest) 
    case "ResourceDay": 
     frequest.predicate = NSPredicate(format: "resourceDay.identifier == '\(identifier)'") 
     return try! context.executeFetchRequest(frequest) 
    case "CostedDay": 
     frequest.predicate = NSPredicate(format: "costedDay.identifier == '\(identifier)'") 
     return try! context.executeFetchRequest(frequest) 
    default: 
     print("wrong entity for this function") 
     return nil 
    } 
} 

Avec Swift 3.0, le « Type Résultat générique ne peut pas être inférées », donc au lieu de passer Dans le titre de l'entité Chaînes, puis-je passer dans le type d'entité et l'activer pour ma demande de récupération?

Répondre

1

Essayez ceci:

let frequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity) 
+0

j'ai finalement réalisé que je ne l'ai pas besoin de passer la description de l'entité après tout. Malheureusement, le titre de la question peut être trompeur pour les autres. – Shane

2

Pour répondre à votre question

donc au lieu de passer dans le titre entité Strings, puis-je passer le type d'entité, et allumer que pour ma demande d'extraction ?

Oui, ce serait la meilleure approche. Quelque chose comme

retrieveItemsForRelatedEntity(entity: NSManagedObject, relatedEntity: String, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? { 

From another question

Vous devez spécifier le type générique, car sinon l'appel de méthode est ambiguë.

La première version est définie pour NSManagedObject, la deuxième version est générée automatiquement pour chaque objet à l'aide d'une extension, par exemple:.

Cette extension est générée automatiquement (comme on peut le voir ci-dessous avec le type Animal

de la documentation d'Apple sur les changements de Swift 2 à Swift 3

NSFetchRequest est maintenant un type paramétré basé sur un nouveau protocole NSFetchRequestResult.

Le nom de la fonction pour executeFetchRequest(...) a également changé à Swift 3

public func fetch<T : NSFetchRequestResult>(_ request: NSFetchRequest<T>) throws -> [T] 

d'Apple Documentation exemple des modifications apportées à NSFetchRequest

Swift 2

func findAnimals() { 
    let request = NSFetchRequest(entityName:”Animal") 
    do { 
     guard let searchResults = try context.executeFetchRequest(request) as? [Animal] else { 
      print("Results were not of the expected structure") 
     } 
     ... use(searchResults) ... 
    } catch { 
    print("Error ocurred during execution: \(error)") 
} 

}

Swift 3

func findAnimals() { 
    let request: NSFetchRequest<Animal> = Animal.fetchRequest 
    do { 
     let searchResults = try context.fetch(request) 
     ... use(searchResults) ... 
    } catch { 
     print("Error with request: \(error)") 
    } 
} 

Donc la conversion de votre code Swift 2 pour créer NSFetchRequest

let frequest = NSFetchRequest(entityName: entity) 

à Swift 3

let frequest: NSFetchRequest<YourEntityType> = YourEntityType.fetchRequest() 

et

context.executeFetchRequest(frequest) 

seront

context.fetch(frequest) 

Note: De autres exemples à travers le Web l'exemple de code docs Apple Animal.fetchRequest peut être erroné et devrait être à la place Animal.fetchRequest()

2

s'il vous plaît essayer. Ça m'a aidé.

func retrieveItemsForRelatedEntity(entity: String, relatedEntity: NSEntityDescription, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? { 

    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    let context: NSManagedObjectContext = appDelegate.persistentContainer.viewContext 

    let frequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity) 

et

switch relatedEntity { 
    case NSEntityDescription.entity(forEntityName: "CostCentre", in: context)!: