2017-04-15 1 views
0

Je suis enfin en train de tenter de convertir une de mes applications Objective-C en Swift 3.1. Je prends également un tutoriel sur Swift pour m'aider. Cependant, je rencontre l'erreur suivante en essayant de convertir une boucle 'for in' en Swift qui a fonctionné avec succès dans Obj-C. J'ai posté le code Swift et Objective-C ci-dessous et j'ai commenté la ligne dans Swift où je reçois l'erreur. Je reçois l'erreur avec for managedObject: NSManagedObject in myResults{Objective-C convertir en Swift 3.1 obtenir l'erreur «Tout» n'est pas convertible

Les états d'erreur

'Tout' est pas convertible 'MSManageObject'

Toute aide me pointant dans la bonne direction est grandement appréciée.

//IN SWIFT 3.1 
      let context: NSManagedObjectContext? = 
CoreDataHelper.shared().context 
      let fetchRequest = NSFetchRequest<NSFetchRequestResult>() 
      let entity = NSEntityDescription.entity(forEntityName: 
"Exhibitors", in: context!) 
      fetchRequest.entity = entity 
      var myResults : NSArray = try! 
CoreDataHelper.shared().context.fetch(fetchRequest) as NSArray 
      self.objects = myResults as! [Any] 
      if !(myResults != nil) || !((myResults.count) != nil) { 
       print("No Exhibitor objects found to be deleted!") 
      } 
      else { 
     //****Getting error 'Any' is not convertible to 'NSManagedObject' 
       for managedObject: NSManagedObject in myResults { 
        if !(managedObject.value(forKey: "fav") == "Yes") { 
         context?.deleteObject(managedObject) 
         var error: Error? = nil 
         // Save the object to persistent store 
         if !context?.save(error) { 
          print("Can't Save! \(error) \ 
(error?.localizedDescription)") 
         } 
         print("Exhibitor object deleted!") 
        } 
       } 
      } 


//IN OBJECTIVE-C 
      NSManagedObjectContext *context = [[CoreDataHelper sharedHelper] 
context]; 

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] 
init]; 

        NSEntityDescription *entity = [NSEntityDescription 
entityForName:@"Exhibitors" inManagedObjectContext:context]; 

        [fetchRequest setEntity:entity]; 

        NSArray *myResults = [[[CoreDataHelper sharedHelper] 
context] executeFetchRequest:fetchRequest error:nil]; 
        self.objects = myResults; 
        if (!myResults || !myResults.count){ 
         NSLog(@"No Exhibitor objects found to be deleted!"); 
        } 
        else{ 
         for (NSManagedObject *managedObject in myResults) { 
          if (![[managedObject valueForKey:@"fav"] 
isEqualToString:@"Yes"]) { 


           [context deleteObject:managedObject]; 


           NSError *error = nil; 
           // Save the object to persistent store 
           if (![context save:&error]) { 
            NSLog(@"Can't Save! %@ %@", error, 
[error localizedDescription]); 
           } 
           NSLog(@"Exhibitor object deleted!"); 

          } 
         } 
        } 

Répondre

0

Le problème principal est que vous annotez les types les plus mauvais que ceux du compilateur.

Ne faites pas cela. N'annote pas les types sauf si le compilateur vous dit de le faire.

Par exemple, le contexte de l'objet géré est censé être non-option

let context = CoreDataHelper.shared().context 

Votre chercher retours [NSManagedObject], ne jamais utiliser NSArray et ne jamais jeter types distincts jusqu'à plus non précisée comme [Any]

écrire simplement

let fetchRequest = NSFetchRequest<NSFetchRequestResult>() 
let entity = NSEntityDescription.entity(forEntityName: "Exhibitors", in: context) 
fetchRequest.entity = entity 
do { // its always recommended to do a good error handling !! 
    self.objects = try CoreDataHelper.shared().context.fetch(fetchRequest) 
    for managedObject in self.objects { 

     ... 

    } 

} catch { print(error) } 

Si objects est vide le la boucle sera ignorée.

+0

Ceci en plus de la recommandation de @ Alistra a fonctionné après l'avoir implémenté et en acceptant ce que Swift suggérait pour résoudre certains problèmes qui surgissaient. – bachma0507

0

Au lieu de cela:

var myResults : NSArray = try! CoreDataHelper.shared().context.fetch(fetchRequest) as NSArray 

Faites ceci:

let myResults : [NSManagedObject] = try! CoreDataHelper.shared().context.fetch(fetchRequest) 

Vous devez également utiliser moins les opérateurs !, car ils peuvent planter votre application, essayez d'utiliser le modèle guard let ou ? les opérateurs.

+0

Avec la requête d'extraction donnée, le type de retour est garanti à [NSManagedObject] ', le' guard' n'échouera jamais. – vadian

+0

Correction du commentaire de @ vadian – Alistra