2016-10-22 10 views
8

何か助けていただければ幸いです。スイフト3 - NSFetchRequest別個の結果

8に更新Xcodeの自動...私はすべてのコードは全体変換しましたが、1つの事が今破壊されたIOS 9.3

をターゲットにしています、私は同様の質問では、様々な提案を試してみました! だった私のフェッチリクエストはでした。

私の目標は明確なリストを得ることです。

let results = try context.fetch(fetchRequest) 

としてコンソールに記述エラーで:ライン上でアプリがクラッシュそれはdoesnの下の行が隠されている場合はここ

Could not cast value of type 'NSKnownKeysDictionary1' (0x10fd29328) to 'MyApp.BodyType' (0x10eebc820). 

は機能

func getBodyTypes() { 
      let context = ad.managedObjectContext 
      let fetchRequest = NSFetchRequest<BodyType>(entityName: "BodyType") 
      fetchRequest.propertiesToFetch = ["name"] 
      fetchRequest.returnsDistinctResults = true 
      fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

      do { 
       let results = try context.fetch(fetchRequest) 

       for r in results { 
        bodyTypes.append(r.value(forKey: "name") as! String) 
       } 
      } catch let err as NSError { 
       print(err.debugDescription) 
      } 
} 

ですしかし、私は欲しいものを手に入れません!

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

私は私がバンドエイドの修正としてそれらを通しての結果(4300)のすべてのループを使用することができます理解しますが、これはそれが前に働いていた、特にとして、この問題を解決するための正しい方法のように感じることはありません!あなたが適切にキャストする必要がありますので、

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BodyType") 

このフェッチ要求の結果[Any]です:<NSFetchRequestResult>の代わりにあなたのフェッチ要求で<BodyType>、使用 -

+0

同じ問題を。あなたはそれを解決しましたか? –

+0

同じです:/すべてのニュース?私は一時的にそれを解決しました。 – datayeah

+0

同じ問題... @datayeahがやっていることをやっているつもりですが、そうでなければSQL側からこれに対する解決策を見つけることはできません。 –

答えて

7

トリックは、一般的な、より一般的にすることです辞書型に変換します。例:

func getBodyTypes() { 
    let context = ad.managedObjectContext 
    // 1) use the more general type, NSFetchRequestResult, here: 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BodyType") 
    fetchRequest.propertiesToFetch = ["name"] 
    fetchRequest.returnsDistinctResults = true 
    fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

    do { 
     let results = try context.fetch(fetchRequest) 

     // 2) cast the results to the expected dictionary type: 
     let resultsDict = results as! [[String: String]] 

     for r in resultsDict { 
      bodyTypes.append(r["name"]) 
     } 

    } catch let err as NSError { 
     print(err.debugDescription) 
    } 
} 

注:NSFetchRequestResultは4種類で採択されたプロトコルで、次のとおりです。
- NSDictionary
- NSManagedObject
- NSManagedObjectID、および
- 通常NSNumber

、私たちがしていますあなたのBodyTypeのようなNSManagedObjectでそれを使用します。この場合は、しかし、あなたは理由書の辞書の種類を取得している:

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 
+0

私の一日が保存されました。ありがとう:) – Ali

-1
 let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: 
    "BodyType") 
    fetchRequest.propertiesToFetch = ["name"] 
    fetchRequest.returnsDistinctResults = true 
    fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

    do { 
     let results = try context.fetch(fetchRequest) 

     for r in results { 
      let p = (r as AnyObject).value(forKey: "name") as! String 
      print(p) 
     } 


    } catch let err as NSError { 
     print(err.debugDescription) 
    } 
+1

このコードを説明してください。 – RamenChef

関連する問題