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

如何在Objective-C中正确访问Swift Package成员并解决init不可用问题

解决方案

一、Swift Package 导入到 Objective-C 项目的正确方式

你查到的用@import导入的方式是正确的,完整操作流程如下:

  • 先在Xcode中通过File > Add Packages路径将目标Swift Package添加到你的OC项目,确认项目Target的Frameworks, Libraries, and Embedded Content列表中已经引入了该包
  • 在需要调用包内容的OC文件头部直接添加@import 你的包名;即可,无需额外创建桥接文件,公有的Swift符号会自动暴露给OC调用

二、'init' isn't available报错原因

你当前的RicClass仅自定义了带参数的init(msg: String)初始化方法,没有显式声明无参的init方法。NSObject的默认无参init方法在子类自定义了指定初始化方法后不会自动继承,也不会默认暴露给OC调用,因此调用[[RicClass alloc] init]会报错。

三、修复方案

修改Swift Package中RicClass的代码,添加显式的无参init方法,同时给需要暴露给OC调用的属性、方法加上@objc标记:

public class RicClass: NSObject {
    @objc public var msg = "Mother has a feeling, I might be too appealing."
    @objc public let text = "Hello Everybody!"
    
    // 新增暴露给OC的无参初始化方法
    @objc public override init() {
        super.init()
    }
    
    @objc public init(msg: String) {
        super.init() // 原有初始化方法补全父类初始化调用
        if msg.isEmpty {
            self.msg = "Hello Ric!"
        }
    }
  
    @objc public func sayHello() {
        print(text)
    }
    
    @objc public func doSomething() {
        print("Inside doSomething()")
    }
}

修改完成后重新编译Swift Package,即可正常运行你需要的OC代码:

@import RicPackage; // 替换为你实际的包名

RicClass *ricClass = [[RicClass alloc] init];
[ricClass sayHello];

内容的提问来源于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.10 05:39:01