【Swift Package】ビルド時のリンクで意図したリンクの状態にならず、メモリアドレスが一致しない
解決したいこと
iOS アプリで複数の Swift Package を利用しています。
App と Test 両方でロードされるライブラリ(Hoge)を dynamic、依存するライブラリ(Fuga)を static とすることで、App と Test が同一の Fuga クラスのメモリアドレスを見ることを期待しています。
しかし、実際には Test ターゲット側で Fuga が別のメモリアドレスとしてロードされてしまい、テストが正しく動きません。
少し細かく書くと、Fugaライブラリで定義しているプロトコルをApp側で準拠させた型があります。Test時にApp側で定義した型のメソッドを呼び出し、内部でFugaのメソッドを呼び出します。そのオブジェクトの型がFugaのプロトコルに準拠しているかチェックしていますが、そこで実態として別のプロトコルに準拠していると扱われてしまっています。
App / Test が 同じ動的ライブラリ経由で Fuga を共有できる構成を実現したいです。
発生している問題・エラー
App と Test のリンク状態が以下のようになっています:
App → Hoge(Dynamic)
Hoge → Fuga(Static)
Test → HogeTest, Hoge, Fuga(Static)
これらはXcodeでビルドした時のリンクのログをもとに判断しています。
このため、Fuga 内のクラスが App と Test で異なるメモリアドレスとして扱われています。
期待する理想の状態
App → Hoge(Dynamic)
Test → Hoge(Dynamic)
つまり、Test ターゲットからも Hoge を動的リンクさせ、Fuga を 1 つだけロードしたいです。
環境・構成
プロジェクトファイル
App ターゲット
Test ターゲット(Unit Test)
Swift Package「Hoge」
2 つのライブラリを公開
Hoge(App/Test 両方から利用するため dynamic)
HogeTest(Test のみが利用)
Package.swiftの抜粋
products: [
.library(
name: "Hoge",
type: .dynamic,
targets: ["Hoge"]
),
.library(
name: "HogeTest",
targets: ["HogeTest"]
)
]
targets: [
.target(
name: "Hoge",
dependencies: ["Fuga"]
),
.target(
name: "HogeTest",
dependencies: ["Hoge"]
)
]
Swift Package「Fuga」
1 つのライブラリを公開(static)
Package.swiftの抜粋
products: [
.library(
name: "Fuga",
type: .static,
targets: ["Fuga"]
)
]
Packageで定義している依存関係
App → Hoge → Fuga
Test → HogeTest → Hoge → Fuga
リンクの仕方の設定、ビルド時の設定で解決するのか、ご存知の方いたら教えていただけると非常に助かります ![]()

