Swift,无法转换类型的值

bmp9r5qi  于 2022-12-10  发布在  Swift
关注(0)|答案(6)|浏览(130)

我创建了一个UICollectionViewController的子类,并将其命名为LibraryCollectionViewController,同时选中了项目和测试的复选框,它的故事板id为LibraryCollectionViewController,并在interface builder中设置了相应的类。
作为SwiftiOS测试的新手,我尝试在我的测试用例中示例化所述视图控制器,如下所示:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let libraryCollectionVC = storyboard.instantiateViewControllerWithIdentifier("LibraryCollectionViewController") as! LibraryCollectionViewController

我得到以下错误:

Could not cast value of type 'MyApp.LibraryCollectionViewController' (0x1010b01f0) to 'MyAppTests.LibraryCollectionViewController' (0x10bd7f580).

所以很明显,它不是在强制转换,但由于我对Swift还是个新手,我发现自己无法确定错误本身是否是由以下原因引起的:
1.我在创建子类时做错了一些事情,我引用了一个不同的子类(因此,MyApp.[vc] vs MyAppTests.[vc])
1.使用as!的转换不正确
1.任何其他原因
任何帮助将不胜感激,提前感谢。

更新1:当我创建视图控制器时,最后一步在Target标题下显示了2个复选框,我启用了这两个复选框,这是否是原因?

9bfwbjaz

9bfwbjaz1#

我的问题是我从单元测试中引用了NSBundle.mainBundle(),而我需要用途:

let bundle = Bundle(for: self.classForCoder)

编辑:2022,在AppCode中使用SwiftPM,在我的Package.swift中使用一个resources

let bundle = Bundle.module
5jvtdoz2

5jvtdoz22#

如果一个类是 * 两个 * 目标(可能是两个框架?)的成员,并且您的应用以某种方式引用了一个框架,而单元测试目标引用了第二个目标,则会发生这种情况。
因此,其中一个编译后的工件具有完全限定的类型Framework1.MyClass,而另一个是Framework2.MyClass--它们在运行时是 * 不同的类 *,因为它们具有不同的命名空间(即使这两个类都是从同一个Swift源文件编译的)。

dgenwo3n

dgenwo3n3#

试试这个:

  • 打开LibraryCollectionViewController.swift
  • Option + Command + 1 打开 * 文件检查器 *
  • 查找 * 目标成员资格 * 部分
  • 检查MyApp
7uhlpewt

7uhlpewt4#

您不能同时选中视图控制器的两个目标。您必须只启用视图控制器的项目目标。您必须导入测试用例文件中的类模块,如@testable import myprojectname,而不是同时启用这两个目标。

r55awzrz

r55awzrz5#

我有同样的问题,因为我正在使用导航控制器尝试这个:
1.删除嵌入式导航控制器
1.直接绑定这两个视图控制器
我希望能成功

ymdaylpp

ymdaylpp6#

我也遇到了同样的问题。您需要:
1.删除类及其文件。
1.打开xcdatamodeld文件。
1.选择导致问题的类。
1.点击Xcode上的“编辑器”。
1.单击“创建NSManagedObject子类”,它将为您重新创建该类。

相关问题