6

我的“ ProjName.xcdatamodel”中有一个名为“问题”的实体。在这个实体中,我有 5 个属性(“icehockey”、“volleyball”、“soccer”、...),每个属性都有 type transformable。每行(属性)都将填充一个 NSMutableArray。我想要做的是获取该实体中特定属性的值。这是我的代码:

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

这当然行不通,因为我从数据库 ( results[0] as NSManagedObject) 中取出结果的第一个索引,因此如果该元素与我正在寻找的 valueForKey 不同,它将崩溃。

如何获得我正在寻找的一个结果行?即“足球”,或者至少我可以以某种方式遍历结果并比较每个结果行的键,这样当我尝试使用错误的键时它不会崩溃?像这样:

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

我希望我的解释清楚!

4

2 回答 2

1

valueForKey方法返回一个可选的,您可以使用if let如下

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

这适用于 Xcode 6.3.2,但看起来您使用的是旧版本。如果是这样更新到最新的。

于 2015-06-19T11:46:37.060 回答
1

我不确定我是否清楚地了解您要达到的目标。但是使用下一个函数(使用 KVC),您可以获得类属性列表,然后检查您需要的属性是否存在:

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
}
于 2015-06-20T02:07:33.597 回答