Swift,无法转换类型的值
Posted
技术标签:
【中文标题】Swift,无法转换类型的值【英文标题】:Swift, could not cast value of type 【发布时间】:2015-04-23 18:29:29 【问题描述】:我创建了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 的新手,我发现自己无法确定错误本身是否是由以下原因引起的:
-
我在创建子类时做错了,我引用了另一个子类(Ergo the MyApp.[vc] vs MyAppTests.[vc])
使用
as!
的转换不正确
任何其他原因
任何帮助将不胜感激,在此先感谢。
更新 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 【参考方案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】:我遇到了同样的问题,因为我使用的是导航控制器 试试这个:
删除嵌入式导航控制器
直接绑定这两个视图控制器
我希望它有效
【讨论】:
【参考方案6】:我有同样的问题。您需要:
-
删除您的课程及其文件。
打开您的 xcdatamodeld 文件。
选择导致问题的类。
点击 Xcode 上的“编辑器”。
单击“创建 NSManagedObject 子类”,它将为您重新创建类。
【讨论】:
以上是关于Swift,无法转换类型的值的主要内容,如果未能解决你的问题,请参考以下文章
Swift:无法将“NSDate”类型的值转换为预期的参数类型“NSDateComponents”
Swift:无法将“UnsafeMutablePointer”类型的值转换为预期的参数类型“UnsafeMutablePointer”
Swift 1.2 到 Swift 2:无法将类型的值转换为预期的参数类型