2017-04-15 87 views
0

我终于尝试将我的一个Objective-C应用程序转换为Swift 3.1。我还在Swift上做了一个教程来帮助我。然而,当我尝试将'for in'循环转换为在Obj-C中成功运行的Swift时,我遇到了以下错误。我已经发布了下面的Swift和Objective-C代码,并在Swift中评论了我得到错误的那一行。我得到的错误与 for managedObject: NSManagedObject in myResults{Objective-C转换为Swift 3.1出现错误'Any'不可转换

的错误状态

“任何”是无法转换为“MSManageObject”

任何帮助指着我在正确的方向是极大的赞赏。

//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!"); 

          } 
         } 
        } 

回答

0

主要问题是您的注释比编译器推断的类型更糟。

不这样做。除非编译器告诉你这样做,否则不要注释类型。

例如在管理对象方面应该是不可选的

let context = CoreDataHelper.shared().context 

你获取回报[NSManagedObject],从来没有使用NSArray,从来没有投不同类型多达更加不确定像[Any]

简单地写

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

如果objects是空的循环将被跳过。

+0

除了@ Alistra的推荐之外,它还实施了它,并接受了Swift提出的修正某些问题的建议。 – bachma0507

0

取而代之的是:

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

这样做:

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

你也应该少用!运营商,因为它们可能会崩溃您的应用程序,请尝试使用guard let模式或?运营商。

+0

对于给定的提取请求,返回类型保证为'[NSManagedObject]','guard'永远不会失败。 – vadian

+0

根据@ vadian的评论修复了这个问题 – Alistra