2016-11-02 4 views
1

In einer früheren Version von schnellen zu funktionieren, ich hatte eine Kerndatenfunktionswift 3 - Pass Einheit als Argument

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 
    } 
} 

Mit Swift 3.0, die so anstelle dem Führens „Generic Typ Ergebnis kann nicht geschlossen werden“, Kann ich im Entitätstitel Strings den Entitätstyp übergeben und den für meine Abrufanforderung einschalten?

Antwort

1

Try this:

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

ich muss ich schließlich erkannte nicht, nachdem alle die Einheit Beschreibung passieren. Leider kann der Fragetitel für andere auf der Strecke irreführend sein. – Shane

2

Ihre Frage

so statt vorbei in den Entity Title Strings zu beantworten, kann ich in der Entity-Typ übergeben, und schalten Sie das für meine Abrufanforderung ?

Ja, das wäre der beste Ansatz. So etwas wie

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

From another question

Sie haben den generischen Typen angeben, da sonst der Methodenaufruf mehrdeutig ist.

Die erste Version für NSManagedObject definiert ist, ist die zweite Version einer Erweiterung, zB automatisch für jedes Objekt erzeugt werden.

Diese Erweiterung automatisch generiert wird (wie unten mit dem Typ Animal gesehen werden kann

von Apples Dokumentation über Änderungen von Swift 2 zu Swift 3

NSFetchRequest ist jetzt ein parametrisierter Typ basierend auf einem neuen NSFetchRequestResult-Protokoll.

für executeFetchRequest(...) Der Name der Funktion auch in Swift 3

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

Apple-Dokumentation Beispiel von Änderungen an 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)") 
} 

}

geändert

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)") 
    } 
} 

Code in Swift So konvertieren 2 für NSFetchRequest Schaffung

let frequest = NSFetchRequest(entityName: entity) 

zu Swift 3

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

und

wird

context.fetch(frequest) 

Hinweis sein: Von anderen Beispielen über die Bahn das Apple-docs Codebeispiel von Animal.fetchRequest falsch sein kann und sollte stattdessen sein Animal.fetchRequest()

2

bitte diese versuchen. Es hat mir geholfen.

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) 

und

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