【问题标题】:Get URL to a local file with SPM (Swift Package Manager)使用 SPM(Swift 包管理器)获取本地文件的 URL
【发布时间】:2019-08-19 11:30:08
【问题描述】:

我正在尝试在我的单元测试中读取 .json 文件并在 Swift 包中运行它。使用 Xcode 11 和 Swift 5.1

let path = Bundle.main.url(forResource: filename, withExtension: "json")
// Path is nil

有人告诉我,Swift 包不再有捆绑包了。那么我该如何解决这个问题呢?

我的 Swift.package 的一部分

.testTarget(
    name: "ProjectTests", 
    dependencies: [
        .target(name: "Project")
    ],
    path: "Tests",
    exclude: [
        "Folder/File.swift"
    ]
)

【问题讨论】:

    标签: swift swift-package-manager


    【解决方案1】:

    我们找到的解决方案是FileManager

    var cache: [String: URL] = [:] // Save all local files in this cache
    let baseURL = urlForRestServicesTestsDir()
    
    guard let enumerator = FileManager.default.enumerator(
        at: baseURL,
        includingPropertiesForKeys: [.nameKey],
        options: [.skipsHiddenFiles, .skipsPackageDescendants], 
        errorHandler: nil) else {
            fatalError("Could not enumerate \(baseURL)")
    }
    
    for case let url as URL in enumerator where url.isFileURL {
        cache[url.lastPathComponent] = url
    }
    

    你需要这个方法

    static func urlForRestServicesTestsDir() -> URL {
        let currentFileURL = URL(fileURLWithPath: "\(#file)", isDirectory: false)
        return currentFileURL
            .deletingLastPathComponent()
            .deletingLastPathComponent()
    }
    

    在此之后,您可以获得每个文件的 URL:

    func url(for fileName: String) -> URL? {
        return cache[fileName]
    }
    

    如果您只想在 Swift 包中运行此代码,请使用 #if SWIFT_PACKAGE

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2021-04-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-24
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多