Swift致命错误:...应为〈某个类型>,但找到〈某个类型>

zzzyeukh  于 2023-02-07  发布在  Swift
关注(0)|答案(2)|浏览(105)

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

final class ViewItem: NSManagedObject {
// …
}

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

let viewItemFetchRequest = NSFetchRequest<ViewItem>(entityName: "ViewItem")

作为

viewContext.performAndWait {
  do {
    let fetchedViewItems = try viewContext.fetch(viewItemsFetchRequest)
    let viewItems = Set(fetchedViewItems)
    // …
  }

尽管代码在正常操作期间正确执行,但在单元测试期间它会崩溃。
当我在try指令后面设置断点时,会到达此断点,即提取不会抛出。
但是,当我想通过Set(fetchedViewItems)或使用访问fetchedViewItems时,我得到了一个致命错误

(lldb) po fetchedViewItems
Fatal error: NSArray element failed to match the Swift Array Element type
Expected ViewItem but found ViewItem
2022-06-07 10:31:30.245019+0200 ShopEasy[42069:1864673] Fatal error: NSArray element failed to match the Swift Array Element type
Expected ViewItem but found ViewItem
1 value

下面是堆栈帧的相关部分:

原因可能是什么?我如何解决这个问题?
PS:我发现了一些与此错误相关的帖子,thisthisthis one,但在这些帖子中没有一个报告Expected <some type> but found <some type>

    • 编辑:**

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

viewContext.performAndWait {
  do {
    let fetchedViewItems: [ViewItem] = try viewContext.fetch(viewItemsFetchRequest)
    let fetchedObjects: [AnyObject] = try viewContext.fetch(viewItemsFetchRequest)
    let viewItems = Set(fetchedViewItems)
    // …
  }

并在崩溃的指令let viewItems = Set(fetchedViewItems)处设置断点。
这是到达断点时的情况:
在调试区域的变量视图中打印fetchedObjects的说明,可以得到

Printing description of fetchedObjects:
▿ 1 element
  ▿ 0 : <ShopEasy.ViewItem: 0x10b3147c0> (entity: ViewItem; id: 0x10b822540 <x-coredata:///ViewItem/t51E2E772-5F7C-43E4-BBC6-68DC139F1BE02>; data: {
    fixedAtTopAt = nil;
…

在控制台中

(lldb) po fetchedObjects
▿ 1 element
  ▿ 0 : <ShopEasy.ViewItem: 0x10b3147c0> (entity: ViewItem; id: 0x10b822540 <x-coredata:///ViewItem/t51E2E772-5F7C-43E4-BBC6-68DC139F1BE02>; data: {
    fixedAtTopAt = nil;
…

但是,在"调试"区域的"变量视图"中打印fetchedViewItems的说明会导致

Printing description of fetchedViewItems:
([ShopEasyTests.ViewItem]) fetchedViewItems = 1 value {
  [0] = 0x000000010b3147c0
}

但在控制台中

(lldb) po fetchedViewItems
Fatal error: NSArray element failed to match the Swift Array Element type
Expected ViewItem but found ViewItem
2022-06-08 08:54:02.359228+0200 ShopEasy[51124:2241262] Fatal error: NSArray element failed to match the Swift Array Element type
Expected ViewItem but found ViewItem
1 value

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

kognpnkq

kognpnkq1#

我可以在一个示例项目中重现您的错误,其中托管对象类定义文件被添加到应用程序目标和单元测试目标。当运行关于在两个位置实现的类的测试时,这也会给出一些控制台警告。
你的情况就是这样吗?

代码应该只存在于应用目标中,并且应该使用@testable import ShopEasy在单元测试中访问应用代码。

kwvwclae

kwvwclae2#

我有同样的错误消息,在我的情况下,我失踪:
NSManagedObject类定义之上的@objc(ViewItem)
我只有:

final class ViewItem: NSManagedObject {

而不是:

@objc(ViewItem)
final class ViewItem: NSManagedObject {

相关问题