7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Swift] ローカルな Swift Package でリソースを読み込む

Last updated at Posted at 2023-03-13

初めに

全然情報がなくて詰まったので、tips くらいの感覚で残しておきます。

前提

Swift Packgage Manager(以後 SPM) はリモート(GitHubなど)から、ライブラリを読み込む際に使われることが多いでしょう。

今回は、ローカルにある Swift Packgage(例えば、自分で作成したオリジナルのパッケージ)を読み込む場合を想定しています。

  • Example

問題

環境

発生した環境は Xcode 13.4 からでした。
(それより前は不明)

内容

ローカル SPM で開発を進めると、テストもそちらに移行したくなりますが、ここでリソースを読み込む際に問題がありました。

具体的には、以下の記事に従って行なったのですがうまくいかず...

Json が読み込まれず、テストで使用できない問題が発生しました。

解決策

パッケージのコードを修正します。

元のコード例は記事より引用するとこちらです。

.swift
import PackageDescription

  targets: [
    .target(
      name: "Example",
      dependencies: [],
      resources: [
        .process("Resources"),
      ]),
    .testTarget(
      name: "ExampleTests",
      dependencies: [Example],
      resources: [
        .copy("Resources"),
      ]),

これを以下のようにします。

Package.swift
import PackageDescription

  targets: [
    .target(
      name: "Example",
      dependencies: [],
      resources: [
        /// これはプロダクションで使用しないならなくても良い ///
        .process("Resources"),
      ]),
    .testTarget(
      name: "ExampleTests",
      dependencies: [Example],
      resources: [
        /// ディレクトリ指定だとファイルが読み込まれないので、ファイルごとに指定する ///
-        .copy("Resources"),
+        .copy("Resources/Json/xxx.json"),
+        .copy("Resources/Json/yyy.json"),
      ]),

1つずつファイルを指定することで読み込まれるようになりました。

上記の記事では、古い Xcode ではディレクトリが 、Resources だと読み込まれないとありました。新しい Xcode では特に問題はなかったです。

ちなみに余談ですが、 Swift Playgrounds でアプリ開発する場合は、Resources が内部の予約後として使用されているので、扱いには注意が必要です。

読み込みの注意

Bundle を読み込む際にも注意が必要です。

SPM からの場合は module からにしないと読み込まれません。 SwiftGen のコードを参考にして以下のようにすると良いでしょう。

.swift
#if SWIFT_PACKAGE
return Bundle.module
#else
return Bundle(for: Xxx.self) // 任意のクラス
#endif

終わりに

ファイルが増えると Package の中身が大きくなってしまうので、ディレクトリで指定する方法があるはずでは?と思っているので、どなたかご存知であればコメントいただけますとmm

冒頭の通り、忘れたくない自分のメモ書きを記事にしたので、誰かのお役に立てたら幸いですmm

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?