斯威夫特,无法施放类型的价值

时间:2015-04-23 18:29:30

标签: ios swift

我创建了UICollectionViewController的子类并将其命名为LibraryCollectionViewController,并标记了项目和测试的两个复选框。它的故事板ID也是LibraryCollectionViewController,并在界面构建器上设置了相应的类。

不熟悉 Swift iOS测试我去尝试在我的测试用例中实例化所述视图控制器,如下所示:

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. 我在创建子类时做错了,我引用了另一个(Ergo the MyApp。[vc] vs MyAppTests。[vc])
  2. 使用as!的广告投放不正确
  3. 任何其他原因
  4. 任何帮助都会很感激,提前谢谢。

    更新1:当我创建视图控制器时,最后一步显示目标标题下的2个复选框,我启用了它们,这可能是原因?

6 个答案:

答案 0 :(得分:8)

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

let bundle = NSBundle(forClass: self.classForCoder)

答案 1 :(得分:5)

如果一个类是两个目标(可能是两个框架?)的成员,就会发生这种情况 - 而且你的应用程序以某种方式引用一个框架,而单元测试目标引用第二个目标。

因此,其中一个编译的文物具有完全限定类型Framework1.MyClass而另一个是Framework2.MyClass - 并且它们在运行时不同类因为它们具有不同的命名空间。 (即使这两个类都是从同一个Swift源文件编译的)

答案 2 :(得分:0)

试试这个:

  • 打开LibraryCollectionViewController.swift
  • 选项 + 命令 + 1 以打开文件检查器
  • 查找目标会员部分
  • 检查MyApp

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我遇到了同样的问题,因为我正在使用导航控制器 试试这个:

  1. 删除嵌入式导航控制器

  2. 直接绑定这两个视图控制器

我希望它能起作用

答案 5 :(得分:-2)

我有同样的问题。你需要:

  1. 删除您的课程及其文件。
  2. 打开xcdatamodeld文件。
  3. 选择导致问题的类。
  4. 点击"编辑"在Xcode上。
  5. 点击"创建NSManagedObject子类",它将为您重新创建课程。