2017-04-15 21 views
0

私はObjective-CのアプリケーションをSwift 3.1に変換しようとしています。また私はスイフトのチュートリアルを手伝っています。しかし、私はObj-Cでうまく動作したSwiftにforループを変換しようとすると、次のエラーに遭遇しています。以下のSwiftとObjective-Cの両方のコードを投稿し、エラーが発生しているSwiftの行にコメントしました。私は、エラー状態 Objective-CのSwift 3.1への変換エラー「Any」は変換できません

「どれが」「MSManageObject」

すべてのヘルプは大歓迎され、右方向に私を指してに変換できない for managedObject: NSManagedObject in myResults{

でエラーを取得しています。

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

主な問題は、コンパイラが推論するよりも悪い型に注釈を付けることです。

しないでください。コンパイラがあなたに指示しない限り、型に注釈を付けないでください。管理オブジェクトコンテキストがNSArrayを使用していないと[Any]

のようなより、不特定までの異なるタイプをキャストすることはありません単に書く決して、あなたのリターン[NSManagedObject]をフェッチ非オプション

let context = CoreDataHelper.shared().context 

ことになっているたとえば

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の推奨に加えて、それを実装した後にスウィフトが提出した特定の問題を修正するために提案したものを受け入れました。 – bachma0507

0

の代わりに、この:彼らはあなたのアプリケーションをクラッシュすることとして、あなたはまた、guard letパターンや?を使用してみてください、以下!演算子を使用する必要があります

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

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

これを行ってください演算子。

+0

与えられたフェッチ要求では、戻り値の型は '[NSManagedObject]'であることが保証されています。 'guard'は決して失敗しません。 – vadian

+0

@ vadianのコメントに従って修正しました – Alistra

関連する問題