从 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 语句中正确处理它。
我在从 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 语句中正确处理它。