为啥 Objective-C 看不到特定的 Swift 类?

Posted

技术标签:

【中文标题】为啥 Objective-C 看不到特定的 Swift 类?【英文标题】:Why is a specific Swift class not visible to Objective-C?为什么 Objective-C 看不到特定的 Swift 类? 【发布时间】:2019-10-13 00:46:38 【问题描述】:

全部

Xcode 10.3 和 Swift 5.0

我有一个包含 3 个目标(“名称”、“名称测试”和“本地名称”)的复杂项目

我已经设置了 Swift 和 Objective-C 之间的所有互操作性标头,包括 Name-Bridging-Header.h、用于选择性导入 Name-Swift.hName_Test-Swift.hName_Local-Swift.h 的 Objc 预处理器宏

#ifdef TEST
#import "Name_Test-Swift.h"
#elif LOCAL
#import "Name_Local-Swift.h"
#else
#import "Name-Swift.h"
#endif

我已经导入了几个我经常使用的 Swift 类,并且一切正常。

现在....

我添加了一个新的 Swift 类。这个新类是 NSObject 的子类

class NewClass: UIView  

但是在Objective-C 类中使用新类,Xcode 找不到这个新类,出现以下错误:

# import "Name-Swift.h" 无法识别。

NewClass *item = [NewClass alloc]; - 未知类型名称'NewClass'

我检查了以下内容: - 新类被添加到所有目标中,并在 Build-Phases->Compile-Sources 部分进行验证

我的其他 Swift 类没有 public 或 @objc 标识符,一切正常......所以我仍然尝试在新类中使用它们(@objc 和类定义中的 public),没有成功

在任何 Objective-C 类中只添加 NewClass *item = [NewClass alloc]; 会使 Xcode 停止识别 "Name-Swift.h"

知道缺少什么吗?

【问题讨论】:

只是为了确保:您是否执行了 Product>Clean、删除派生数据和重新启动 Xcode 的常规仪式? 嗨@Yonat...我尝试了所有这些,还重新启动了我的Mac并重新启动了Xcode....我发现我无法在.h文件中声明一个Swift类实例我必须在 .m 【参考方案1】:

经过一番测试,发现需要在我要声明对象的.h文件中导入Name-Swift.h文件。

我的项目在Name-Prefix.pch 中定义了#import Name-Swift.h

#ifdef TEST
#import "Name_Test-Swift.h"
#elif LOCAL
#import "Name_Local-Swift.h"
#else
#import "Name-Swift.h"
#endif

.pch 文件中的#import 声明允许 Swift 类可以从我的 Objective-C 类的 .m 文件的任何位置访问,但不能从 .h 访问

我不确定这是否是预期的行为...我将深入研究文档。

【讨论】:

“我发现我无法在 .h 文件中声明 Swift 类实例”这意味着什么?您不应该在 .h 文件中声明任何 Swift 类,也不应该在其中导入生成的 Swift 标头。如果您需要在 .h 文件中提及 Swift 类,只需使用 @class 转发声明名称即可。

以上是关于为啥 Objective-C 看不到特定的 Swift 类?的主要内容,如果未能解决你的问题,请参考以下文章

01--Java语言概述与开发环境 最适合入门的Java教程

Cocoapod使用Mix和Match Swift和Objective-c代码

01-Java语言概述与开发环境 最适合入门的Java教程

Swift和Objective-C混合编程——Swift调用OC

为啥 Objective-C 对象必须动态分配?

Objective-C,为啥这些 NSArrays 不匹配?