核心数据Swift在优化的版本中抛出generics函数失败

我们有一个相当广泛的核心数据模型的应用程序,在Objective C中实现了大量的自定义子类,但是这些子类也是使用Swift编写的应用程序的一部分。 (值得一提的是:我们正在使用Xcode 7.3.1和iOS 9.3进行构build,因此Swift代码是2.2)。

有一个用Swift编写的帮助函数,看起来像这样:

extension NSManagedObject { func inContext<T: NSManagedObject>(moc: NSManagedObjectContext) -> T? { guard self.managedObjectContext != moc else { return (self as! T) } do { let obj = try moc.existingObjectWithID(self.objectID) return (obj as! T) // <--- fails here } catch let error { return nil } } } 

这在对象跳转上下文的相当多的地方被调用。 调用代码通常如下所示:

 let result: ECFoo? = foo.inContext(managedObjectContext) 

这完美地运行在应用程序的debugging版本。 但是打开优化,我遇到了一个情况,这个调用在我标记的行失败,从NSManagedObject转换到正确的子类。 堆栈跟踪以swift_dynamicCastObjCClassUnconditional开始,并且logging到控制台的消息是:

无法将“ECFoo_Foo_”(0x7fb857d2c250)types的值转换为“ECFoo_Foo_”(0x7fb857d2c250)。

如果我在该行上放置一个断点,我试图在debugging器控制台中看起来很好:

(lldb) po moc.existingObjectWithID(self.objectID)是ECFoo
真正

这是非常令人困惑的,因为这里显然是两个types,它们都是dynamic生成的子类,而不是它应该尝试投入的正式类(基于对调用代码的推断)。 我只能假定有一些信息被优化掉,这是做这项工作所必需的,但我不完全确定如何解决这个问题。