如何让SPM中Objective-C的NSURL分类在Swift URL类型上生效?
解决SPM中Objective-C NSURL分类无法在Swift URL类型上调用的问题
问题原因
传统项目通过桥接文件引入Objective-C代码时,Xcode会自动将NSURL的分类方法映射到Swift的URL类型上;但在SPM包中,这种自动映射机制不生效,导致仅能在NSURL类型上访问分类属性/方法。
解决方案
通过在SPM包中添加Swift扩展,手动为URL类型封装对NSURL分类方法的调用,具体步骤如下:
- 在SPM包的目标目录下创建一个Swift文件(比如
URL+Additions.swift),内容如下:
import Foundation extension URL { var queryParams: [String: String]? { // 借助桥接关系,将self转为NSURL后调用分类方法 return (self as NSURL).queryParams as? [String: String] } }
- 修改SPM的
Package.swift文件,确保这个Swift文件被包含在对应的target中:
let package = Package( name: "URLUtils", products: [ .library(name: "URLUtils", targets: ["URLUtils"]), ], targets: [ .target( name: "URLUtils", dependencies: [], path: "Sources", sources: ["NSURL+Additions.h", "NSURL+Additions.m", "URL+Additions.swift"] // 加入新增的Swift文件 ), .testTarget( name: "URLUtilsTests", dependencies: ["URLUtils"]), ] )
- 重新编译SPM包后,Swift代码中无论是
NSURL还是URL类型,都可以正常调用queryParams属性。
补充说明
如果你的SPM包中有多个Objective-C分类需要适配Swift桥接类型,都可以用这种方式一一对应添加Swift扩展,保证两种类型的API一致性。
内容的提问来源于stack exchange,提问作者nacho4d
相关产品推荐
相关产品推荐

