需要使用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
}
}
}
答案 0 :(得分:2)
NSArray
有valueForKey
方法,但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以获取示例。