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

Posted

技术标签:

【中文标题】Swift 3“任何”类型的值没有成员“valueForKey”【英文标题】:Swift 3 Value of type 'Any' has no member 'valueForKey' 【发布时间】:2016-09-15 07:13:16 【问题描述】:

我正在使用 Xcode 8 中的 Swift 3.0 使用 Core Data 编写一个测试程序。问题是当我尝试从 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”

那么问题是如何从类型 Any 中获取单个记录数据? 附言如果可能的话,不要强制转换为 AnyObject 类型,因为它会导致这个

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

其中也有错误:

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

我想以适当的方式做到这一点。 谢谢!

更新

我找到了一个解决方案(感谢 Vadian),但我怀疑它是否正确:

    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 

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

【问题讨论】:

不,也是报错: Type 'Any' 没有下标成员 在哪里做这个? fetch(request) as [String: AnyObject] 据我了解 entityTableInCoreData 只是一个 NSManagedObjects 数组。所以我只需要从中获取数据。 fetch 返回[Any]。您必须将类型向下转换为[NSManagedObject][NSFetchRequestResult],或者如果您使用的是NSManagedObject 的子类(推荐),则为[&lt;Name Of Subclass&gt;] 【参考方案1】:

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

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

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

【讨论】:

以上是关于Swift 3“任何”类型的值没有成员“valueForKey”的主要内容,如果未能解决你的问题,请参考以下文章

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

“任何?”类型的 Swift 3 值没有成员“对象”

Swift 3.0:“IndexSet”类型的值没有成员“enumerateIndexesUsingBlock”

Swift 3 / 如何处理嵌套的 NSDictionaries,因为“Any 类型的值没有成员值”

“MKMapItem”类型的值在 Swift 3 中没有成员“网站”

“GKEntity”类型的值没有成员“componentForClass”。为啥我在 swift 3.0 中找不到这种方法?