如何在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
相关产品推荐
相关产品推荐

