【问题标题】:Swift, could not cast value of typeSwift,无法转换类型的值
【发布时间】:2015-04-23 18:29:29
【问题描述】:

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

作为 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. 我在创建子类时做错了,我引用了另一个子类(Ergo the MyApp.[vc] vs MyAppTests.[vc])
  2. 使用as! 的转换不正确
  3. 任何其他原因

任何帮助将不胜感激,在此先感谢。

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

【问题讨论】:

  • 你在IB中定义了自定义类吗? (顺便说一句,我认为它应该是 return UIStoryboard(name: "Main", bundle: NSBundle.mainBundle().)
  • 在 IB 中,我将类(在“自定义类”标题下方)设置为 LibraryCollectionViewController。我会试试捆绑包
  • @matthias 使用 bundle 给出了相同的结果 :(
  • 我认为原因是您启用了两者(也许)。 MyAppTests 尝试禁用这个
  • 也许这有助于 UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType)) iosmike.com/2014/08/unit-testing-viewcontrollers-in-swift.html

标签: ios swift


【解决方案1】:

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

let bundle = Bundle(for: self.classForCoder)

【讨论】:

    【解决方案2】:

    如果一个类是 两个 目标(可能是两个框架?)的成员,并且您的应用以某种方式引用了一个框架,而单元测试目标正在引用第二个目标,则可能会发生这种情况。 p>

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

    【讨论】:

    • 这是一个很好且合乎逻辑的解释,但是否还有解决此问题的解决方案,因为我遇到了这个确切的问题。
    • 当然。您需要考虑类需要包含在哪个目标中,以及哪些目标依赖于其他目标。示例:您的 app 目标和 unit test 目标中都包含一个 swift 文件。这将导致从该文件生成 两个 类。但是该代码已经可用于 unit test 目标,因为它依赖于 app 目标 - 因此您可以将其从单元测试目标中删除。
    【解决方案3】:

    试试这个:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        我希望它有效

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2016-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-01
            相关资源
            最近更新 更多