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

从Objective-C调用Swift Package中函数的正确语法是什么

问题解决方案

核心报错原因

你当前的报错本质是两个问题:

  1. Swift Package 中的类型默认不会被自动导入到主项目自动生成的 ObjcSwiftHeader-Swift.h 头文件中,你写的 @class RicClass; 仅为前置声明,编译时无法获取完整的类接口定义,因此无法识别 alloc 方法。
  2. 你对 Swift Package 中类的调用路径不符合 Objective-C 与 Swift 混编的规则。

方案1:通过主项目Swift层封装(推荐)

该方案无需修改 Swift Package 配置,符合组件封装逻辑,适用绝大多数场景:

  • 你已经在主项目中定义了暴露给 Objective-C 的 Greetings 类,所有对 RicPackage 内部成员的调用,都可以封装在 Greetings 的方法中,不需要在 Objective-C 侧直接接触 RicPackage 的类型。
  • 直接删除 Objective-C 代码中的 @class RicClass; 和 RicClass *ricClass = [RicClass alloc]; 两行代码,剩余代码可直接正常编译运行,[greetings doSomethingWithName: @"Ric"] 内部对 RicClass 的调用完全合法。

方案2:直接在 Objective-C 中调用 Swift Package 中的类

如果确实需要在 Objective-C 侧直接操作 RicClass,按照以下步骤修改:

  1. 修改 Swift Package 中 RicClass 的代码,给所有需要暴露给 Objective-C 的方法添加 @objc 标记:
public class RicClass: NSObject {
    @objc public var msg = "Mother has a feeling, I might be too appealing."
    @objc public let text = "Hello Everybody!"
    
    public override init() {}
  
    @objc public func sayHello() {
            print(text)
        }
    @objc public func doSomething() {
        print("Inside doSomething()")
    }
}
  1. 修改主项目中 Objective-C 侧的代码:
    • 删除 @class RicClass; 前置声明
    • 新增模块导入语句 @import RicPackage;
    • 修正 RicClass 初始化语句,补充 init 调用:
#import "ViewController.h"
#import "ObjcSwiftHeader-Swift.h"
@import RicPackage; // 新增这行

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"Inside VC ViewDidLoad.");
    Greetings *greetings = [Greetings shared];
    [greetings hello];
    [greetings doSomethingWithName: @"Ric"];
    
    RicClass *ricClass = [[RicClass alloc] init]; // 修正初始化语句
}

@end
  1. 确认主项目的 Build Settings 中 Allow Modules 和 Link Frameworks Automatically 配置为 YES(Xcode 默认开启)。

注意事项

  • Swift 中的 Struct 类型无法暴露给 Objective-C,因此 RicPackage 中的 RicStruct 无法在 Objective-C 中调用,只有继承自 NSObject 的类才能被暴露给 Objective-C。
  • 所有需要暴露给 Objective-C 的 Swift 方法、属性都必须添加 @objc 标记,否则不会出现在 Objective-C 可见的接口列表中。

内容的提问来源于stack exchange,提问作者Frederick C. Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:48:02