Reputation: 1462
I have an entity in my "ProjName.xcdatamodel
" with the name "Questions". In this entity I have 5 attributes ("icehockey","volleyball","soccer",...), each with type transformable
. Each row (attribute) will be filled with a NSMutableArray.
What I want to do is to get the value of a specific attribute in this entity. This is my code:
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
}
}
This will ofcourse not work since I take out the first index of the results from the database (results[0] as NSManagedObject
) and thus it will crash if that element is not the same as the valueForKey I'm looking for.
How do I get the one result row that I'm looking for? I.e. "soccer", or at least can I somehow loop through the results and compare the keys of each result row so it doesn't crash when I try with the wrong key? Like something like this:
for (res) in results as NSManagedObject {
if(res.key == "soccer") {
qArr = res.valueForKey("soccer") as NSMutableArray
return qArr
}
}
I hope I'm clear in my explanation!
Upvotes: 6
Views: 2378
Reputation: 1393
I'm not sure I clearly understand what you are trying to achieve. But using next function(that using KVC) you can get a list of class properties and than check if the one you need is there:
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
}
Upvotes: 1
Reputation: 1800
the valueForKey
method returns an optional, you can use if let
as below
if let questionsArr = res.valueForKey("\(sport)") as? NSMutableArray {
return questionsArr
} else {
return []
}
This works in Xcode 6.3.2, but looks like you are using older one. If so update to latest one.
Upvotes: 1