Core data Swift 3类型的值';任何';没有成员';valueForKey';

Core data Swift 3类型的值';任何';没有成员';valueForKey';,core-data,nsmanagedobject,swift3,xcode8,any,Core Data,Nsmanagedobject,Swift3,Xcode8,Any,我正在用Xcode 8中的Swift 3.0编写一个包含核心数据的测试程序。问题是,当我尝试从NSManagedObject接收任何数据时,如下所示: let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity") request.returnsObjectsAsFaults = false do { let entityTableInCoreData = try newPrivateQ

我正在用Xcode 8中的Swift 3.0编写一个包含核心数据的测试程序。问题是,当我尝试从NSManagedObject接收任何数据时,如下所示:

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity")
request.returnsObjectsAsFaults = false
do {
    let entityTableInCoreData = try newPrivateQueueContext.fetch(request)
    for i in entityTableInCoreData {
        if let a = i.valueForKey("b") as? String {
            print(a)
        }
    }
} catch {
}
以错误为标志

“Any”类型的值没有成员“valueForKey”

所以问题是如何从任何类型的单记录数据中获取数据? 如果可能,请注意,不要强制转换为任何对象类型,因为它会导致这种情况

if let a = (i as AnyObject).value("b") as? String {
这也有一个错误:

无法使用类型为“(字符串)”的参数列表调用“值”

我想用正确的方式来做。 谢谢大家!

更新

我找到了一个解决方案(多亏了瓦迪安),但我怀疑它是否正确:

    do {
    let entityTableInCoreData = try newPrivateQueueContext.fetch(request)
    for i in entityTableInCoreData {
        print("Record")
        //print(i)
        if let a = i as? NSManagedObject {
            print("a: \(a.value(forKey: "a"))")
        }
    }

} catch {
}

我仍在寻找一种正确的方法来实现这一点。

fetch
返回
[Any]
。您需要将类型向下转换为实际类型,在本例中为
[NSManagedObject]

let entityTableInCoreData = try newPrivateQueueContext.fetch(request) as! [NSManagedObject]

强制向下广播是安全的,因为根据获取请求,它保证返回类型为
NSManagedObject

否,这也是一个错误:类型“Any”没有下标成员。在何处执行此操作?据我所知,entityTableInCoreData只是NSManagedObject的一个数组,获取(请求)为[String:AnyObject]。所以我只需要从中获取数据。
fetch
返回
[Any]
。您必须将类型向下转换为
[NSManagedObject]
[NSFetchRequestResult]
,或者如果您使用的是
NSManagedObject
的子类,建议将其转换为
[]
let entityTableInCoreData = try newPrivateQueueContext.fetch(request) as! [NSManagedObject]