6

Mam podmiot w moim "ProjName.xcdatamodel" z nazwą "Pytania". W tym podmiocie mam 5 atrybutów ("icehockey", "siatkówka", "piłka nożna", ...), każdy z typem transformable. Każdy wiersz (atrybut) zostanie wypełniony ramką NSMutableArray. Co chcę zrobić, to uzyskać wartość określonego atrybutu w tym obiekcie. To jest mój kod:Swift pobiera określony obiekt NSManagedObject z obiektu (dane podstawowe)

func readQuestionsFromCore(sport:NSString) -> NSMutableArray { 
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 
    var context:NSManagedObjectContext = appDel.managedObjectContext! 

    var request = NSFetchRequest(entityName: "Questions") 
    request.returnsObjectsAsFaults = false 
    var results: NSArray = context.executeFetchRequest(request, error: nil)! 
    var qArr:NSMutableArray! 
    if results.count > 0 { 
     var res = results[0] as NSManagedObject 
     qArr = res.valueForKey("\(sport)") as NSMutableArray 
     return qArr 
    } else { 
     qArr = [] 
     return qArr 
    } 
} 

Będzie to oczywiście nie działa odkąd wyjąć pierwszy indeks wyników z bazy danych (results[0] as NSManagedObject), a więc będzie się zawiesić, jeśli ten element nie jest taka sama jak valueForKey I” m szukasz.

Jak uzyskać pojedynczy wiersz wyników, którego szukam? To znaczy. "piłka nożna", a przynajmniej czy mogę w jakiś sposób przejrzeć wyniki i porównać klucze każdego wiersza wyników, aby nie uległy awarii, gdy próbuję użyć niewłaściwego klucza? Jak coś takiego:

for (res) in results as NSManagedObject { 
    if(res.key == "soccer") { 
     qArr = res.valueForKey("soccer") as NSMutableArray 
     return qArr 
    } 
} 

Mam nadzieję, że w wyjaśnieniu jestem czysty!

+0

Pomoc byłaby naprawdę doceniana. Szukałem w Internecie źle, nie miałem szczęścia! – user2099024

+0

Myślę, że musisz dodać NSPredicate do swojego "żądania". Następnie możesz przefiltrować dane, które chcesz odesłać z encji. Spójrz na ten link na przykład: http://nshipster.com/nspredicate/ –

+0

@KevinHorgan Spróbuje, gdy w domu! – user2099024

Odpowiedz

1

metoda valueForKey zwraca opcjonalny, można użyć if let jak poniżej

if let questionsArr = res.valueForKey("\(sport)") as? NSMutableArray { 
    return questionsArr 
} else { 
    return [] 
} 

Działa to w Xcode 6.3.2, ale wygląda używasz starszej. Jeśli tak, zaktualizuj najnowszą.

1

Nie jestem pewien, czy jasno rozumiem, co próbujesz osiągnąć. Ale używając następnej funkcji (używając KVC), możesz uzyskać listę właściwości klasy i sprawdzić, czy potrzebna jest tam:

func getPropertyList(#classToInspect: AnyObject.Type) -> [String] 
{ 
    var count : UInt32 = 0 
    let properties : UnsafeMutablePointer <objc_property_t> = class_copyPropertyList(classToInspect, &count) 
    var propertyNames : [String] = [] 
    let intCount = Int(count) 
    for var i = 0; i < intCount; i++ { 
     let property : objc_property_t = properties[i] 
     let propertyName = NSString(UTF8String: property_getName(property))! 
     propertyNames.append(propertyName as String) 
    } 
    free(properties) 
    println(propertyNames) 

    return propertyNames 
} 
Powiązane problemy