无法在 Xcode 12 项目中找到 *.json 文件
Could not find a *.json file inside an Xcode 12 project
我是第一次同时尝试 Swift (5.3) 和 Xcode (12)。任务是解析附近已存在的 *.json 文件。
老实说,在Xcode项目中添加文件比实际解析它更棘手:无论我把它放在哪里,总是找不到。 This answer didn't help, because there's no Target Membership section in File Inspector(我猜,它在 Xcode 12 中被重命名或移动到其他地方;也许我错了;无论如何,也找不到它)。
我还注意到,在创建新的 Project 与新的 Swift Package[ 时,Target Membership 部分的行为有所不同。如果它是一个项目,则会显示 Target Membership。由于我已经创建了一个包,因此我无法使用此部分。
有人可以帮助我了解这里发生了什么吗?
项目结构(称为“TryParseJSON”,它被组织为一个Swift包)如下:
TryParseJSON/
Package.swift
Sources/
TryParseJSON/
main.swift # defines `findPath(to:)` and calls `findPath(to: "persons.json")`
Person.swift
persons.json # this file is not found
Package.swift
文件内容如下:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "TryParseJSON",
products: [
.executable(name: "TryParseJSON", targets: ["TryParseJSON"]),
],
targets: [
.target(
name: "TryParseJSON",
dependencies: [],
resources: [
.copy("persons.json"),
]
),
]
)
.copy("persons.json")
中的路径是相对于main.swift;如果我放置一个相对于 Package.swift (.copy("Sources/TryParseJSON/persons.json")
) 的路径,Xcode 找不到 JSON("found 1 file(s) which are unhandled"
显示警告),包仍然不起作用; .copy("persons.json")
没有警告。
已添加 persons.json 文件 File > New > 文件 >“空”(类别“其他”)>重命名为“persons.json”。
findPath
函数:
func findPath(to file: String) -> URL {
guard
let path = Bundle.main.url(forResource: file, withExtension: nil)
else {
fatalError("File \(file) was not found") // this is called
}
return path
}
这个函数是在main.swift:
里面定义和调用的
let path = findPath(to: "persons.json")
我不知道这是怎么回事,我不知道我到底应该做什么才能“在目标中添加新成员”,我不知道目标和产品是什么,并且我很沮丧,因为在 Xcode 中添加文件需要 很大的努力。
在 Swift 5.3 中,包可以添加和处理非代码资源。但是,Package.swift
必须明确定义它们。通过将资源添加到目标来执行此操作:
targets: [
.target(
name: "TryParseJSON",
resources: [
.copy("persons.json")
]
)
]
这会将其复制到 Bundle 中,希望在正确的位置。如果没有,可能需要额外的配置。
请注意,路径是相对于包含目标源的目录的。 Apple 建议在您的源目录中创建一个名为 Resources
的子目录。如果你这样做,你需要
.copy("Resources/persons.json")
此外,确保 Package.swift
在顶部定义 Swift 工具 5.3,如下所示:
// swift-tools-version:5.3
当您需要访问文件时,您如何尝试提取文件的 URL 也很重要。根据 Apple docs,您必须始终使用 Bundle.module.url(forResource:,withExtension:)
来获取资源的 URL。所以,在上面的例子中使用
guard let resourceUrl = Bundle.module.url(forResource: "persons",withExtension: "json")
else { /* fail */ }
我是第一次同时尝试 Swift (5.3) 和 Xcode (12)。任务是解析附近已存在的 *.json 文件。
老实说,在Xcode项目中添加文件比实际解析它更棘手:无论我把它放在哪里,总是找不到。 This answer didn't help, because there's no Target Membership section in File Inspector(我猜,它在 Xcode 12 中被重命名或移动到其他地方;也许我错了;无论如何,也找不到它)。
我还注意到,在创建新的 Project 与新的 Swift Package[ 时,Target Membership 部分的行为有所不同。如果它是一个项目,则会显示 Target Membership。由于我已经创建了一个包,因此我无法使用此部分。
有人可以帮助我了解这里发生了什么吗?
项目结构(称为“TryParseJSON”,它被组织为一个Swift包)如下:
TryParseJSON/ Package.swift Sources/ TryParseJSON/ main.swift # defines `findPath(to:)` and calls `findPath(to: "persons.json")` Person.swift persons.json # this file is not found
Package.swift
文件内容如下:// swift-tools-version:5.3 import PackageDescription let package = Package( name: "TryParseJSON", products: [ .executable(name: "TryParseJSON", targets: ["TryParseJSON"]), ], targets: [ .target( name: "TryParseJSON", dependencies: [], resources: [ .copy("persons.json"), ] ), ] )
.copy("persons.json")
中的路径是相对于main.swift;如果我放置一个相对于 Package.swift (.copy("Sources/TryParseJSON/persons.json")
) 的路径,Xcode 找不到 JSON("found 1 file(s) which are unhandled"
显示警告),包仍然不起作用;.copy("persons.json")
没有警告。已添加 persons.json 文件 File > New > 文件 >“空”(类别“其他”)>重命名为“persons.json”。
findPath
函数:func findPath(to file: String) -> URL { guard let path = Bundle.main.url(forResource: file, withExtension: nil) else { fatalError("File \(file) was not found") // this is called } return path }
这个函数是在main.swift:
里面定义和调用的let path = findPath(to: "persons.json")
我不知道这是怎么回事,我不知道我到底应该做什么才能“在目标中添加新成员”,我不知道目标和产品是什么,并且我很沮丧,因为在 Xcode 中添加文件需要 很大的努力。
在 Swift 5.3 中,包可以添加和处理非代码资源。但是,Package.swift
必须明确定义它们。通过将资源添加到目标来执行此操作:
targets: [
.target(
name: "TryParseJSON",
resources: [
.copy("persons.json")
]
)
]
这会将其复制到 Bundle 中,希望在正确的位置。如果没有,可能需要额外的配置。
请注意,路径是相对于包含目标源的目录的。 Apple 建议在您的源目录中创建一个名为 Resources
的子目录。如果你这样做,你需要
.copy("Resources/persons.json")
此外,确保 Package.swift
在顶部定义 Swift 工具 5.3,如下所示:
// swift-tools-version:5.3
当您需要访问文件时,您如何尝试提取文件的 URL 也很重要。根据 Apple docs,您必须始终使用 Bundle.module.url(forResource:,withExtension:)
来获取资源的 URL。所以,在上面的例子中使用
guard let resourceUrl = Bundle.module.url(forResource: "persons",withExtension: "json")
else { /* fail */ }