目次
Session概要
Swift Packageを使ってSwiftコードをシェアする際、リソースも一緒にシェアしましょう。画像やStoryboardといったアセットをPackageに含める方法、それらをコードからアクセスする方法について。また、ローカライズされた文字列を追加することで世界中のユーザがコードにアクセスできるようにする方法にてついて https://developer.apple.com/videos/play/wwdc2020/10169/
Swift Packageにリソースを追加する方法について
- Xcode 12では画像やStoryboardなどのリソースイア外の他のファイルもPackageに追加できるようになった
- これらのリソースもローカライズ可能
- Xcode 12からPackage内で持つSwiftUI Viewをプレビューできる機能が追加された
- 実行するために同一 workspace内にアプリは不要
- Packageで利用可能なファイルタイプは下記
- Text FileやShell Scriptなどのファイルはその使用目的をPackageマニフェストの中で宣言する必要がある
- Swiftファイル、アセットファイル、Storyboard等は目的が明確なので不要
- Packageマニフェストの構文とファイルシステム構成との関係については Adopting Swift Package in Xcode を参照
- Text FileやShell Scriptなどのファイルはその使用目的をPackageマニフェストの中で宣言する必要がある


Xcodeがリソースとして取り扱わないファイルの指定方法
excludes
を設定することでPackageビルド時に無視されるように指定可能- ファイル、ディレクトリどちらも可能
- ファイル、ディレクトリどちらも可能

Packageマニフェストのサンプル
// swift-tools-version:5.3
import PackageDescription
let package = Package(name: "MyGame",
products: [
.library(name: "GameLogic",
targets: ["GameLogic"])
],
targets: [
.target(name: "GameLogic",
excludes: [
"Internal Notes.txt",
"Artwork Creation"],
resources: [
.process("Logo.png"),
.copy("Game Data")]
)
]
)
.process
を使用することで対象とするプラットフォーム用に組み込まれた正しい規則が適用される- 画像であれば圧縮処理など
.copy
はファイルタイプを問わずにリソースの正確なコピーを作成したい場合に使用する

- コマンドラインツールのような非バンドル製品をビルドする時は、そのツールに併せてリソースバンドルをインストールすることが必要になる
Minimum ツールバージョンの注意点
- PackageリソースのサポートはSwift 5.3からなので、Packageマニフェストは5.3を必要なツールのバージョンとして宣言する必要がある

コードからPackageのリソースにアクセスする方法
- FoundationのBundle APIを使用する
- リソースを含むPackageをbuildする際にXcodeは該当するリソースバンドルのためにアクセサーを生成して、それをターゲット向けに作成するコードモジュールへincludeする


ベストプラクティス
- Packageにリソースを含める場合は、それを使用するコードモジュールに対応するターゲットへ追加する必要がある
- 他のモジュールヘリソースを提供する必要がある場合は、個々のリソースにbundleできるように特定の型付けを持つアクセサーを追加するのが最も良い方法
- リソースバンドル全体を他のモジュールへbundleしようとするのは一般的には推奨しない
- 理由は、リソースの名前に関連して外部との依存関係が発生するから
Package内のリソースをローカライズする方法について
- Packageマニフェストに
defaultLocalization: "en"
を設定することで、指定したローカライズが見つからない場合のフォールバックローカリゼーションとして使用される- リソースを含む場合は必ず必要
- ローカリゼーションディレクトリ(
.lproj
)を作成し、Localization.strings
を追加する - アセットカタログもローカライズ可能
