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

Swift 5.9 Cpp-Swift互操作:添加NSObject一致性后调用失败

Swift 5.9 C互操作:添加NSObject一致性后类无法被C识别的解决办法

问题原因

当Swift类继承NSObject或遵循NSObjectProtocol时,编译器会将其标记为Objective-C兼容类型,而Swift 5.9的C互操作机制默认只暴露纯Swift类型(非Objective-C兼容的类型)到生成的CoreModule-Swift.h头文件中,因此C代码无法找到对应的类。

解决方案

方案1:拆分纯Swift类与NSObject兼容类

保留一个纯Swift类供C++调用,单独创建NSObject子类用于Objective-C场景:

import Foundation

// 纯Swift类,专门供C++调用
public class MySwiftClass
{
    public static func testInterop() {
        NSLog("----------- hey --------")
    }
}

// 继承NSObject的类,用于Objective-C相关场景
@objc public class MySwiftNSObjectWrapper: NSObject
{
    @objc public static func testInterop() {
        MySwiftClass.testInterop()
    }
}

C++端的调用代码无需修改,依然可以正常使用CoreModule::MySwiftClass::testInterop()。

方案2:强制暴露Objective-C兼容类到C++

使用Swift 5.9的@_expose(Cxx)属性,强制将NSObject子类暴露给C++。修改Swift代码如下:

import Foundation

@_expose(Cxx)
public class MySwiftClass: NSObject
{
    public static func testInterop() {
        NSLog("----------- hey --------")
    }
}

注意:@_expose(Cxx)是未公开的私有属性(以下划线开头),未来Swift版本可能调整,但当前5.9/6.0版本可稳定使用。

方案3:检查项目配置

如果以上方法无效,确认以下项目设置:

  • 打开Swift目标的Build Settings,确保C++ Interoperability选项设置为Generated Header或On
  • 确保类和方法的访问级别都是public,且方法参数/返回值没有Swift特有类型(如部分Swift专属类型会导致无法暴露)

内容的提问来源于stack exchange,提问作者Vipul Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:42:26