从 CoreData 获取数据时出现“'[AnyObject]' 不可转换为 '[Dog]?'”错误

"'[AnyObject]' is not convertible to '[Dog]?'" error when fetching data from CoreData

我在从 Core Data 获取数据时遇到问题。如果我的术语不具体或不准确,我很抱歉,但我是 Core Data 的新手。

我正在使用 Xcode 7 beta 和 Swift 2。设备 OS 设置为 8.4。

行:

let result = try managedContext.executeFetchRequest(dogFetch) as [Dog]?

给我这个错误:“'[AnyObject]' 不能转换为'[Dog]?'”

完整代码在这里:

do {
    let dogEntity = NSEntityDescription.entityForName("Dog", inManagedObjectContext: managedContext)
    let dog = Dog(entity: dogEntity!, insertIntoManagedObjectContext: managedContext)

    let dogName = "Fido"
    let dogFetch = NSFetchRequest(entityName: "Dog")

    dogFetch.predicate = NSPredicate(format: "name == %@", dog)

    let result = try managedContext.executeFetchRequest(dogFetch) as [Dog]?

    if let dogs = result {
        if dogs.count == 0 {

            currentDog = Dog(entity: dogEntity!, insertIntoManagedObjectContext: managedContext)
            currentDog.name = dogName

        } else {
            currentDog = dogs[0]
        }
    }
} catch let fetchError as NSError {
    print("Could not fetch \(fetchError)")
}

}

我附上了一张图片来展示我的核心数据模型的样子:

核心数据 类 是 "standard",从编辑器 > 创建 NSManagedObjectSubclass 自动创建:

狗+CoreDataProperties.swift:

import Foundation
import CoreData

extension Dog {

    @NSManaged var name: String?
    @NSManaged var walks: NSOrderedSet?

}

Dog.swift:

import Foundation
import CoreData

@objc(Dog)
class Dog: NSManagedObject {

// Insert code here to add functionality to your managed object subclass

}

Walk+CoreDataProperties.swift和Walk.swift基本相同。

--

编辑:所选答案解决了问题。我的想法是,这要么是 Swift 2.x vs Swift 1.x 的变化,要么我从中获得代码的教程是错误的。

你应该做的 managedContext.executeFetchRequest(dogFetch) as? [Dog]

这是因为这里的转换没有保证,所以你应该保护自己免受崩溃(通过使用 as? 进行转换)。上面的语句意味着 executeFetchRequest return 值应该被转换为 [Dog](一个包含 Dog 个实例的数组,顺便说一句,它可以为空),但只有在可能的情况下 - 否则转换将失败,您可以在 catch 语句中正确处理它。