检索ManagedObjects的属性

时间:2015-04-10 15:34:26

标签: swift core-data nsmanagedobject

需要使用Swift访问Core Data记录。

理想情况下,我想打电话给我的班级"核心数据"返回ManagedObject或false(不存在对象)。但是,当我想要检索ManagedObject上的属性时,我得到编译器错误 [NSManagedObject]没有名为' valueForKey'

的成员

我知道类似的问题(例如swift optional chaining with cast),但我无法解决这个问题。需要帮助:)

为了排除故障,我试图访问类中已有的属性(稍后将在课外完成)。代码如下。 为什么我收到编译错误以及如何解决?

谢谢!

class CoreData{

    // Fetch existing data (from Core Data)
    func getData(entity: String) -> AnyObject {

        // Set delegate
        let appDelegate =
        UIApplication.sharedApplication().delegate as AppDelegate

        let managedContext = appDelegate.managedObjectContext!

        // Get entity = a table (filter)
        let fetchRequest = NSFetchRequest(entityName:entity)

        // Create error variable
        var error: NSError?

        // Get record
        let fetchedResults =
        managedContext.executeFetchRequest(fetchRequest,
        error: &error) as [NSManagedObject]?

        if let results = fetchedResults {
            // Data retrieved
            var temp = results.valueForKey("gender") as String // <-- ERROR
            println(temp)
            return results
        } else {
            // Could not obtain data - log it
            println("Could not fetch \(error), \(error!.userInfo)")
            return false
        }
    }
}

1 个答案:

答案 0 :(得分:2)

NSArrayvalueForKey方法,但Swift数组没有。 您有以下选择:

  • 将Swift数组转换为NSArray

    var temp = (results as NSArray).valueForKey("gender") as! String 
    
  • 在Swift数组上使用map(),在每个对象上使用valueForKey

    var temp = map(results) { $0.valueForKey("gender") as! String }
    
  • (推荐)让Xcode为您的实体创建NSManagedObject子类,并将map()与属性访问器一起使用:

    var temp = map(results) { $0.gender }
    

(上面的示例代码是针对当前的Xcode 6.3 / Swift 1.2,在前面 版本必须使用as而不是as!。)

或者,您可以使用.DictionaryResultType创建一个获取请求,以仅获取一些选定的属性, 请参阅Fetching selected attribute in entities以获取示例。