检索 ManagedObjects 的属性

Retrieving attributes for ManagedObjects

需要使用 Swift 访问核心数据记录。

理想情况下,我想将我的 class "Core Data" 称为 returns ManagedObject 或 false(不存在对象)。但是目前,当我想检索 ManagedObject 上的属性时,出现编译器错误 [NSManagedObject] 没有名为 'valueForKey'

的成员

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

为了进行故障排除,我正在尝试访问 class 中已有的属性(稍后将在 class 之外完成)。下面的代码。 为什么我会收到编译器错误以及如何修复它?

谢谢!

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

NSArray 有一个 valueForKey 方法,但 Swift 数组没有。 您有以下选项:

  • 将Swift数组转换为NSArray:

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

    var temp = map(results) { [=11=].valueForKey("gender") as! String }
    
  • (推荐) 让 Xcode 为您的实体创建 NSManagedObject 子类并将 map() 与 属性 存取器:

    var temp = map(results) { [=12=].gender }
    

(以上示例代码针对当前Xcode6.3/Swift1.2,在较早的时候 您必须使用 as 而不是 as! 的版本。)

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