2017-04-15 36 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

相關問題