从Objective-C调用Swift Package中函数的正确语法是什么
问题解决方案
核心报错原因
你当前的报错本质是两个问题:
- Swift Package 中的类型默认不会被自动导入到主项目自动生成的
ObjcSwiftHeader-Swift.h头文件中,你写的@class RicClass;仅为前置声明,编译时无法获取完整的类接口定义,因此无法识别alloc方法。 - 你对 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,按照以下步骤修改:
- 修改 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()") } }
- 修改主项目中 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
- 确认主项目的 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
相关产品推荐
相关产品推荐

