Swift Package中如何调用未迁移的Objective-C类
解决方案:Swift Package中Swift调用Objective-C代码
要让Swift代码能访问Objective-C类,不需要桥接文件,只需通过配置模块暴露和依赖关联来实现,具体步骤如下:
1. 修改Package.swift配置
需要调整两个target的配置:给Objective-C target指定公开头文件路径,让Swift target依赖这个Objective-C target。
修改后的Package.swift代码:
import PackageDescription let package = Package( name: "MyPackage", products: [ .library( name: "MyPackage", targets: ["MyPackageSwift","MyPackageObj"]), ], dependencies: [ ], targets: [ .target( name: "MyPackageSwift", dependencies: ["MyPackageObj"] // 让Swift目标依赖Objective-C目标 ), .target( name: "MyPackageObj", publicHeadersPath: "Include" // 指定公开头文件所在的目录 ), ] )
2. 在Swift代码中导入Objective-C模块
Swift Package会自动将Objective-C代码打包成一个模块,模块名就是你的Objective-C target名称MyPackageObj,只需在Swift代码中导入该模块即可访问其中的类。
修改后的MyPackage.swift代码:
import MyPackageObj // 导入Objective-C模块 public struct MyPackage { public init() { } public func myService() -> String { let objcService = MyObjCClass() let objcContent = objcService.myObjCService() return "This is myService in MyPackage, Objective-C service returns: \(objcContent)" } }
原理说明
- 在Swift Package中,Objective-C代码会被封装成独立模块,无需桥接文件,通过模块导入即可访问
publicHeadersPath指定了Objective-C模块对外暴露的头文件目录,只有该目录下的头文件会被导出供Swift调用- Swift target必须声明依赖Objective-C target,才能在编译时找到对应的模块并完成类型解析
内容的提问来源于stack exchange,提问作者Fab
相关产品推荐
相关产品推荐

