代码之家  ›  专栏  ›  技术社区  ›  Alex

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

  •  1
  • Alex  · 技术社区  · 8 年前

    我正在用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 {
    }
    

    线路

    if let a = i.valueForKey("b") as? String {
    

    标记为错误

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

    如果可能,请注意,不要强制转换为AnyObject类型,因为这会导致

    if let a = (i as AnyObject).value("b") as? String {
    

    也有错误:

    无法使用“(String)”类型的参数列表调用“value”

    我想以正确的方式来做。 非常感谢。

    更新

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

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

    1 回复  |  直到 8 年前
        1
  •  3
  •   vadian    8 年前

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

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

    强制向下转换是安全的,因为根据提取请求,可以保证返回类型为 NSManagedObject .