混编项目中如何对Swift隐藏Objective-C类的部分接口?
解决Objective-C类向Swift隐藏C类型属性的方案
针对你遇到的问题——Objective-C类包含C类型的公开属性,需要供Objective-C代码调用,但导入Swift桥接头文件时编译报错——可以通过以下两种方式实现对Swift隐藏C相关内容:
方法一:用条件编译区分导入场景
利用Swift导入时会自动定义的__SWIFT__宏,在头文件中把C++相关声明仅对Objective-C代码开放:
#import <Foundation/Foundation.h> // 仅在非Swift环境下声明C++类前向引用 #ifndef __SWIFT__ class MyCppType; #endif @interface SwiftCancelationToken : NSObject -(void)doSomethingWithCppObject; @end // 仅在非Swift环境下暴露C++类型属性 #ifndef __SWIFT__ @interface SwiftCancelationToken () @property MyCppType *cppProperty; @end #endif
效果:
- 其他Objective-C代码导入该头文件时,能正常看到
cppProperty属性并调用; - Swift通过桥接头文件导入时,C++相关代码会被宏屏蔽,不会触发编译错误。
方法二:拆分公开/私有头文件
把接口拆分为两个文件,分离Swift可见内容和C++相关内容:
- 公开头文件
SwiftCancelationToken.h:只保留Swift和Objective-C共用的接口,导入到Swift桥接头文件中
#import <Foundation/Foundation.h> @interface SwiftCancelationToken : NSObject -(void)doSomethingWithCppObject; @end
- 私有头文件
SwiftCancelationToken+Private.h:存放C++相关属性,仅提供给需要访问该属性的Objective-C代码
#import "SwiftCancelationToken.h" class MyCppType; @interface SwiftCancelationToken () @property MyCppType *cppProperty; @end
额外注意
- 确保该类的实现文件是
.mm后缀(Objective-C文件),才能正确编译C代码; - 如果
doSomethingWithCppObject方法内部依赖cppProperty,实现文件中要正确导入C++类的完整头文件。
内容的提问来源于stack exchange,提问作者Tom Hamming
相关产品推荐
相关产品推荐

