You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

混编项目中如何对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++相关内容:

  1. 公开头文件SwiftCancelationToken.h:只保留Swift和Objective-C共用的接口,导入到Swift桥接头文件中
#import <Foundation/Foundation.h>

@interface SwiftCancelationToken : NSObject

-(void)doSomethingWithCppObject;

@end
  1. 私有头文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:57:21