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
的子类(推荐),则为[<Name Of Subclass>]
【参考方案1】:
fetch
返回[Any]
。您需要将类型向下转换为实际类型,在本例中为 [NSManagedObject]
。
let entityTableInCoreData = try newPrivateQueueContext.fetch(request) as! [NSManagedObject]
强制向下转换是安全的,因为根据获取请求,它保证返回类型是NSManagedObject
。
【讨论】:
以上是关于Swift 3“任何”类型的值没有成员“valueForKey”的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 - 'Any?' 类型的值没有成员“valueForKey”
Swift 3.0:“IndexSet”类型的值没有成员“enumerateIndexesUsingBlock”
Swift 3 / 如何处理嵌套的 NSDictionaries,因为“Any 类型的值没有成员值”
“MKMapItem”类型的值在 Swift 3 中没有成员“网站”
“GKEntity”类型的值没有成员“componentForClass”。为啥我在 swift 3.0 中找不到这种方法?