swift - 具有 Objective-C NSURL 类别的 SPM 库未导入到 Swift URL 中?

标签 swift objective-c swift-package-manager objective-c-category

我用一堆旧的 Objective-C 代码创建了一个 SPM 包(我想将一些旧代码“带有大桥接 header 的 Objective-C 代码”转换为“Objective -C 在一些 SPM 包中”)对于大多数情况,它工作正常,除了 Objective-C 类别,例如:

@import Foundation;

@interface NSURL (Additions)

@property (copy, readonly) NSDictionary<NSString *, NSString *> *queryParams;

@end

问题: 属性 queryParams 在 Swift 中不适用于 URL 类型,而仅适用于 NSURL 类型。这对我来说看起来很奇怪,因为当在应用程序中声明相同的类别并使用桥接头文件时,queryParams 也可以从 URL 类型使用。

Tests/URLUtilsTests/URLUtilsTestsSwift.swift:18:31: error: value of type 'URL' has no member 'queryParams'
        let queryParams = url.queryParams
                          ~~~ ^~~~~~~~~~~
error: fatalError

问题:使用 SPM 时,我需要在 NSURL 和 URL 中包含 queryParams 什么?

我创建了一个repo in GitHub with reproducing problem

这是我的整个包的屏幕截图:

enter image description here

最佳答案

一种可能的解决方案是创建扩展来处理基于 Objective-C 等效项的 Swift 类型上不存在的属性。

在您的测试中包含 .swift 扩展名:

// URL+QueryParams.swift

import Foundation

extension URL {
    var queryParams: [String: String] {
        var urlDict = [String: String]()
        guard let query = self.query else { return urlDict }
        let subArray = query.components(separatedBy: "&")
        for element in subArray {
            let urlArray = element.components(separatedBy: "=")
            if urlArray.count < 2 { continue }
            urlDict[urlArray[0]] = urlArray[1]
        }
        return urlDict
    }
}

关于swift - 具有 Objective-C NSURL 类别的 SPM 库未导入到 Swift URL 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76201998/

相关文章:

swift - 有人会解释这个处理 Timer.scheduledTimer(withTimeInterval : repeats: block:{})

swift - 展开button.titleLabel.text

iphone - 声明两个属性并使用相同的键调用 objc_setAssociatedObject

swift 4.0 包 generate-xcodeproj 不工作

swift - 在 Swift 中实现可失败初始化器的最佳实践

swift - 函数 Swift 中缺少返回值

objective-c - 将文本从 uitextview 绘制为 pdf

objective-c - 典型的 Objective C 消息实现

像 CocoaPods 一样带有子模块的 Swift 包

ios - 缺少包产品 <包依赖项名称>