swift 属性的未知类型名称

Posted

技术标签:

【中文标题】swift 属性的未知类型名称【英文标题】:Unknown type name for swift property 【发布时间】:2014-06-07 16:22:27 【问题描述】:

我有一个用 swift 编写的 CustomViewController 类和一个用 Objective C 编写的 CustomNavigationController 类。我正在尝试将我的 CustomNavigationController 作为属性添加到我的 CustomViewController。我已将#import "CustomNavigationController.h" 添加到我的桥接头中。

在我的 CustomViewController 我有:

class CustomViewController: UIViewController 

    var navController: CustomNavigationController?
...
//init methods


...


 override func viewDidLoad() 
        super.viewDidLoad()

        //Set up Navigation Controller
        navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as CustomNavigationController!

在我尝试构建和运行之前没有错误...我得到“未知类型名称'CustomNavigationController';你的意思是'UINavigationController'吗?”

有谁知道为什么它不能识别类型?

【问题讨论】:

错误出现在哪一行? 在顶部声明属性时。如果我将 navController 声明为 UINavigationController,然后在 viewDidLoad 中将其向下转换为我的 CustomNavigationController,它就会运行,但我觉得这是一种迂回的做法。 我试过了,对我来说效果很好(至少根据你到目前为止所透露的内容) 查看构建设置并确保 Objective-C 桥接头指向您的桥接头。 @matt 它是......但我刚刚意识到我不需要这是一个属性,所以我只是在 viewDidLoad 中声明了它。这个错误仍然没有意义 【参考方案1】:

在您的 Objective-C 代码中,您正在某处导入自动生成的 -Swift.h 标头。在同一代码中,#import 行之前,插入#import "CustomNavigationController.h"。这两个#import 语句的顺序至关重要!

这将通过确保 CustomNavigationController 位于自动生成的 -Swift.h 标头之前的名称空间中来解决问题,因此后者会知道前者并且一切都会好起来的。

如果该 Objective-C 类不需要了解 CustomNavigationController,这有点令人烦恼,但它解决了未来的问题并允许您继续使用您的混合项目。

【讨论】:

正如@johnboiles 所指出的,这实际上在guide 中。 答案中指出了这一点,但请确保检查您拥有#import X-Swift.h 的每个文件。 我这样做了,浏览了我使用 Swift 类的每个 OBJC 文件并将我的 -Swift.h 文件设置为最后一个包含,但它仍然失败并出现相同的错误:(【参考方案2】:

看起来ProjectName-Swift.h 生成的头文件不会自动包含ProjectName-Bridging-Header.h 的内容。这会导致在导入 ProjectName-Swift.h 之前尚未声明的任何类型在编译器中引发 Unknown type name 错误。这似乎是一个错误。

我的解决方法是创建ProjectName-Swift.h 的替代版本,该版本前向声明导致错误的类,然后导入ProjectName-Swifth.h。我称它为ProjectName-Swift-Fixed.h。对我来说,ProjectName-Swift-Fixed.h 看起来像这样:

// ProjectName-Swift-Fixed.h
@class CustomViewController;
#import "ProjectName-Swift.h"

然后,在我有 #include "ProjectName-Swift.h" 的代码中的任何地方,我都将其替换为 #include "ProjectName-Swift-Fixed.h"

【讨论】:

找到另一个SO post,在Apple's ObjC - Swift Interop Guide 中发现了一个小提示:“如果您在 Swift 代码中使用自己的 Objective-C 类型,请确保为在将 Swift 生成的标头导入您要从中访问 Swift 代码的 Objective-C .m 文件之前的那些类型。" 你的演示项目有一个错误(你的,不是苹果的),我最终发现了。请参阅我的新答案。 我认为你误解了这里的问题。这只发生在你同时在 Objective-C 代码中使用 Swift 类和在 Swift 代码中使用 Objective-C 类的情况下。 ProjectName-Swift.h,告诉你的 Objective-C 代码关于你的 Swift 类的文件,将引用在 Swift 代码中使用的 Objective-C 类。如果这些类尚未导入或前向声明,编译器将出错。 好的,我明白了。但是首先导入这些类的要求非常低,而且肯定比您的解决方法容易得多。例如,在您的johnboiles.s3.amazonaws.com/SharedOnline/MyProject2.zip 示例中,在应用程序委托中只需说#import "CustomViewController.h",然后再说#import "MyProject-Swift.h",问题就解决了。这比你上面的歌舞轻松多了…… 对于只有#import "MyProject-Swift.h" 一次或两次的项目来说,这当然是一个很好的解决方案。如果您在多个地方#import "MyProject-Swift.h",则在您#import "MyProject-Swift.h" 的每个位置上方更新您的#imports 将变得很耗时。我更喜欢在一个地方为 Swift 标头执行所有必要的前向声明和/或导入。【参考方案3】:

如果您无法按照上述答案的建议通过更改 #import 语句的顺序来解决问题,检查您的 ProjectName-Bridging-Header.h 中的文件以查找缺少的框架导入可能会起作用。

就我而言,我在桥接头文件中有一个类,它在其中一种方法中使用了UIImage。当我的项目仅由运行良好的 Objective-C 组成时,但是当将此标头暴露给 Swift 时,我必须添加 #import <UIKit/UIKit.h> 以消除错误。

【讨论】:

【参考方案4】:

试试这个:

navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as? CustomNavigationController

【讨论】:

【参考方案5】:

我遇到了同样的情况。在我的情况下,通过编辑 > 转换 > 到当前 Swift 语法将 所有目标 中的 swift 版本更新为 3.0 后,错误得到解决。希望对你有帮助

【讨论】:

以上是关于swift 属性的未知类型名称的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 导入 Objective-C 给出“未知类型名称”

swift学习笔记构造过程

Realm-Swift CocoaPod 导入后的未知属性“类”

流类型对象中的动态属性名称

具有未知属性名称的 JSON Schema

TypeScript 3.x:访问未知类型的属性