Swift 使用';获取';错误

Swift 使用';获取';错误,swift,core-data,Swift,Core Data,我在Xcode 8.0上使用SWIFT 3.0 我正在尝试循环通过模板创建的获取结果 let request = model.fetchRequestTemplate(forName: "template") do { let result = try context.fetch(request!) // Error on this line for item: EntityClassName in result! { ... } } catch {

我在Xcode 8.0上使用SWIFT 3.0 我正在尝试循环通过模板创建的获取结果

let request = model.fetchRequestTemplate(forName: "template")

do {
    let result = try context.fetch(request!) // Error on this line
    for item: EntityClassName in result! {
        ...
    }
} catch {
    ...
}

我得到错误“不明确地使用'fetch'”。我的方法错了吗?如果是这样,循环获取结果的正确方法是什么?

您使用的方法
fetch
返回
[Any]
,因为它可能是
[Dictionary]
[NSManagedObject]
或其子类之一

您必须将
[Any]
转换为正确的类型

let result = try context.fetch(request!) as! [EntityClassName]
for item in result {
    ...
}
强制展开是绝对安全的,因为根据提取请求,它总是返回
[EntityClassName]

Swift 3揭示了许多在Swift 2中犯过但被容忍的错误,以提高类型安全性

或者,您可以将新的API与泛型一起使用,这样可以避免某些类型转换。

让fetchRequest:NSFetchRequest=model.fetchRequestTemplate(forName:“template”)
let fetchRequest: NSFetchRequest<EntityClassName> = model.fetchRequestTemplate(forName: "template")

do {
    let result = try context.fetch(fetchRequest)
    for item in result {
        ...
    }    
} catch {
    ...
}
做{ let result=try context.fetch(fetchRequest) 对于结果中的项目{ ... } }抓住{ ... }
我不得不将其更改为{let result=try(context.fetch(request!)!as![EntityClassName]},但您的建议帮助很大。谢谢。实际上不需要额外的括号和感叹号。考虑使用新的通用API。虽然这个代码片段可以解决这个问题,但是确实有助于提高您的文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。