2016-10-22 21 views
8

Herhangi bir yardım için teşekkür ederiz.Swift 3 - NSFetchRequest Farklı Sonuçlar

Xcode oto Ben IOS 9.3

Hedefleme ediyorum ... 8 güncellendi genelinde dönüştürülen tüm kodu var ama bir şey artık kırılıyor, ben benzer sorular çeşitli önerilerde çalıştılar! Daha önce çalışmakta olan numaralı numaralı telefonun getirme isteğim artık kesiliyor.

Amacım, farklı bir liste elde etmektir.

let results = try context.fetch(fetchRequest) 

olarak konsolda açıklanan hata ile: hattında uygulama çöker o kokan aşağıdaki satırı gizli ise Burada

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

fonksiyon

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

olduğunu mola, ama sonra istediğimi alamıyorum!

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

Ben yakı düzeltme olarak içlerinden sonuçları (4300) ve döngünün tüm kullanabilirsiniz anlıyorum, ama daha önce çalışıyordu özellikle bu, bunu düzeltmek için doğru bir yol gibi hissetmez! Eğer uygun yayın yapmak için ihtiyacınız olacak şekilde

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

bu getirme talebi sonucu [Any] geçerli: <NSFetchRequestResult> yerine getirme isteğinde <BodyType> kullanın -

+0

Aynı sorun. Çözdün mü? –

+0

Aynı sayfa:/Herhangi bir haber? Ayrıca, farklı olmayan sonuçlarla yineleyerek ve kopyaları göz ardı ederek da geçici olarak çözdüm. – datayeah

+0

Aynı konu ... @datayeah'nın şu anda ne yapmakta olduğunu yapmaya çalışacağım, ancak aksi halde SQL tarafına herhangi bir çözüm bulamadı. –

cevap

7

hüner jenerik daha genel hale getirmektir kullanmadan önce sözlük tipi. Ör:

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

Not: NSFetchRequestResult dört tip tarafından benimsenen bir protokol şöyledir:
- NSDictionary,
- NSManagedObject,
- NSManagedObjectID ve
- Tipik NSNumber

, bizler BodyType gibi bir NSManagedObject kullanarak. Bu durumda, yine de, sen çünkü ifadenin sözlük türünü alıyoruz:

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 
+0

Günümü kurtardım. Thanks :) – 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

Lütfen bu kodu açıklayınız. – RamenChef