Swift 致命错误:...预期 <某些类型> 但发现 <某些类型>

Rei*_*ner 1 arrays unit-testing core-data ios swift

我的应用程序使用 CoreData。其中一个实体是

\n
final class ViewItem: NSManagedObject {\n// \xe2\x80\xa6\n}  \n
Run Code Online (Sandbox Code Playgroud)\n

在单元测试期间,我尝试执行以下获取请求:

\n
let viewItemFetchRequest = NSFetchRequest<ViewItem>(entityName: "ViewItem")  \n
Run Code Online (Sandbox Code Playgroud)\n

作为

\n
viewContext.performAndWait {\n  do {\n    let fetchedViewItems = try viewContext.fetch(viewItemsFetchRequest)\n    let viewItems = Set(fetchedViewItems)\n    // \xe2\x80\xa6\n  }  \n
Run Code Online (Sandbox Code Playgroud)\n

尽管代码在正常操作期间正确执行,但在单元测试期间它会崩溃。

\n

当我在指令后面设置断点时try,就会到达该断点,即取指不会抛出。\n但是,当我想通过或 with
访问 时,出现致命错误fetchedViewItemsSet(fetchedViewItems)

\n
(lldb) po fetchedViewItems\nFatal error: NSArray element failed to match the Swift Array Element type\nExpected ViewItem but found ViewItem\n2022-06-07 10:31:30.245019+0200 ShopEasy[42069:1864673] Fatal error: NSArray element failed to match the Swift Array Element type\nExpected ViewItem but found ViewItem\n1 value  \n
Run Code Online (Sandbox Code Playgroud)\n

这是堆栈帧的相关部分:
\n在此输入图像描述

\n

可能是什么原因以及如何解决该问题?

\n

PS:我发现了一些与此错误相关的帖子,这个这个这个,但没有一个被报告Expected <some type> but found <some type>

\n

编辑:

\n

为了调查情况,我将代码修改如下:

\n
viewContext.performAndWait {\n  do {\n    let fetchedViewItems: [ViewItem] = try viewContext.fetch(viewItemsFetchRequest)\n    let fetchedObjects: [AnyObject] = try viewContext.fetch(viewItemsFetchRequest)\n    let viewItems = Set(fetchedViewItems)\n    // \xe2\x80\xa6\n  }  \n
Run Code Online (Sandbox Code Playgroud)\n

let viewItems = Set(fetchedViewItems)并在崩溃的指令处设置断点。
\n这是到达断点时的情况:

\n

在调试区域的变量视图中打印fetchedObjects的描述给出

\n
Printing description of fetchedObjects:\n\xe2\x96\xbf 1 element\n  \xe2\x96\xbf 0 : <ShopEasy.ViewItem: 0x10b3147c0> (entity: ViewItem; id: 0x10b822540 <x-coredata:///ViewItem/t51E2E772-5F7C-43E4-BBC6-68DC139F1BE02>; data: {\n    fixedAtTopAt = nil;\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

并在控制台中

\n
(lldb) po fetchedObjects\n\xe2\x96\xbf 1 element\n  \xe2\x96\xbf 0 : <ShopEasy.ViewItem: 0x10b3147c0> (entity: ViewItem; id: 0x10b822540 <x-coredata:///ViewItem/t51E2E772-5F7C-43E4-BBC6-68DC139F1BE02>; data: {\n    fixedAtTopAt = nil;\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

但是,在调试区域的变量视图中打印fetchedViewItems的描述会给出

\n
Printing description of fetchedViewItems:\n([ShopEasyTests.ViewItem]) fetchedViewItems = 1 value {\n  [0] = 0x000000010b3147c0\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但在控制台中

\n
(lldb) po fetchedViewItems\nFatal error: NSArray element failed to match the Swift Array Element type\nExpected ViewItem but found ViewItem\n2022-06-08 08:54:02.359228+0200 ShopEasy[51124:2241262] Fatal error: NSArray element failed to match the Swift Array Element type\nExpected ViewItem but found ViewItem\n1 value\n
Run Code Online (Sandbox Code Playgroud)\n

这似乎是应用程序命名空间 (ShopEasy.ViewItem) 和单元测试命名空间 (ShopEasyTests.ViewItem) 之间的一些冲突。

\n

jrt*_*ton 5

我可以在示例项目中重现您的错误,其中托管对象类定义文件已添加到应用程序目标和单元测试目标。当运行有关在两个地方实现的类的测试时,这也会发出一些控制台警告。

您的情况是这样吗?

在此输入图像描述

该代码应该仅出现在您的应用程序目标中,并且您应该用于@testable import ShopEasy在单元测试中访问应用程序代码。