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"
的每个位置上方更新您的#import
s 将变得很耗时。我更喜欢在一个地方为 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 给出“未知类型名称”