从CoreData获取数据时,“'[AnyObject]'无法转换为'[Dog]?'”错误

时间:2015-08-11 14:42:29

标签: swift core-data swift2

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

我正在使用Xcode 7 beta和Swift 2.设备操作系统设置为8.4。

该行:

plt.figure(1)
plt.subplot (121)
plt.title('1')
plt.imshow(matrix_lg, interpolation='bilinear', cmap=plt.cm.jet, vmin=np.log10(minVal), vmax = np.log10(maxVal))
plt.subplot(122)
plt.title('2')
plt.imshow(matrix_lg, interpolation='bilinear', cmap=plt.cm.jet, vmin=np.log10(minVal), vmax = np.log10(maxVal))
plt.colorbar()

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

完整代码在这里:

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

}

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

enter image description here

核心数据类是“标准”,从编辑器>自动创建。创建NSManagedObjectSubclass:

犬+ CoreDataProperties.swift:

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)")
}

Dog.swift:

import Foundation
import CoreData

extension Dog {

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

}

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

-

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

1 个答案:

答案 0 :(得分:4)

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

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