ハイライト
Xcode 12 は、Swift ツール バージョン 5.3 を使用して Swift Package Manager にリソースとローカリゼーションのサポートを追加し、パッケージ ターゲットが画像、ストーリーボード、コア データ モデル、文字列ファイルなどのリソースを保持し、渡すことができるようにします。
Bundle.module実行時にアクセスします。
主要内容
Swift パッケージは、ビジネス ロジックの一部を切り離して再利用するのに非常に適しています。このロジックがインターフェイスとリソースを必要とし始めると、問題が発生します。サイコロ ビューをパッケージに含めることができ、ボタンで点を更新することもできますが、画像リソースはモジュール内になく、プレビューには黒い四角だけが残っています。開発者はリソースをクライアント アプリに残すか、ファイル パス自体に同意するため、再利用の境界はすぐに脆弱になってしまいます。
Xcode 12 ではこの問題が修正されています。パッケージ ターゲットには、イメージ、ストーリーボード、コア データ モデル、その他のランタイム ファイルを含めることができるようになりました。ファイルの種類が明確な場合、Xcode はサフィックスに従って自動的にファイルを処理します。ファイルの目的があいまいな場合、開発者はPackage.swiftここでは、除外するか、処理するか、変更せずにコピーするかを示します。
リソースは、各コード モジュールに属するリソース バンドルに構造化されます。コードは財団のBundleそれにアクセスするための API、Swift コードの最も直接的なエントリ ポイントは次のとおりです。Bundle.module。この設計はシステムの既存の API を継続するため、パッケージにリソースを追加しても、パッケージでサポートされる最小 OS バージョンは増加しません。
ローカリゼーションも同じモデルに含まれます。パッケージマニフェストステートメントdefaultLocalization、それをリソースディレクトリに置きますen.lproj、fr.lprojこのローカライゼーション ディレクトリでは、SwiftUI と UIKit はバンドル パラメーターを通じて文字列と画像を探し続けます。このようにして、パッケージによって提供される機能を、独自のデフォルト言語、翻訳ファイル、ローカリゼーション リソースとともに配布できます。
詳細
パッケージターゲットは特定のタイプのリソースを直接運ぶことができます
(01:10) デモは SwiftUI のサイコロ ビューから始まります。 Xcode 12 では、クライアント アプリなしでワークスペース内のパッケージ内の SwiftUI ビューをプレビューできます。ビューのロジックは機能し、ボタンによってポイントが変更されますが、ポイントを示す画像が欠落しています。
(01:42) スピーカーはDiceUIターゲットの隣にアセット カタログを作成し、さまざまな解像度のサイコロ画像を配置します。なぜなら.xcassetsこのサフィックスには明確な意味があり、Xcode はそれがビルド時に処理され、クライアント製品にパッケージ化されるべきであることを認識します。
重要な API は、モジュール バンドルをリソース読み込みの入り口に渡すことです。
Image("dice-one", bundle: .module)
キーポイント:
ImageSwiftUI の画像読み込みエントリを引き続き使用します。 -"dice-one"これはアセット カタログ内のリソース名であり、セッション内のイメージ名はポイントによって照合されます。 -bundle: .module現在のパッケージ モジュールのリソース バンドルを指します。- トランスクリプトでは、完全な記述方法ではモジュール リソース バンドルを指定し、Swift 型推論を使用してそれを次のように省略できると述べました。
.module。
マニフェストは、あいまいなファイルの目的を説明する責任があります。
(03:13) Xcode はファイルのサフィックスに基づいて一部のリソースを決定します。アセット カタログ、ストーリーボード、コア データ モデルなどのファイルには明確な目的があり、ターゲットに直接追加できます。プレーンテキスト、通常のイメージ、シェルスクリプト、または任意のディレクトリの目的はさらに曖昧です。これらはランタイム リソースである場合もあれば、単なる開発資料である場合もあります。
(04:09) 公式コード スニペットは、パッケージ マニフェストでターゲット ファイルの意図を宣言する方法を示しています。
// 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")]
)
]
)
キーポイント:
// swift-tools-version:5.3リソースによってサポートされているツール チェーンの境界です。 SwiftPM のリソース機能は Swift 5.3 から提供されています。 -excludesビルド システムが内部メモとデザイン アセット ディレクトリをスキップするようになります。 -.process("Logo.png")このファイルをリソースとして処理する必要があることを示します。ほとんどのリソースは使用する必要がありますprocess、ビルド システムがターゲット プラットフォームに基づいて組み込みルールを適用できるようにします。 -.copy("Game Data")実行時にディレクトリによってアクセスする必要があるデータに適した階層構造を保持したまま、ディレクトリをそのままコピーする必要があることを示します。
プロセスとコピーの違いはビルド製品に影響します
(06:56)process処理ルールはディレクトリに再帰的に適用されます。アセット カタログまたはストーリーボードは実行時の使用に適した形式に変換され、画像はプラットフォームのルールに従って圧縮される場合があります。不明なタイプのファイル、または特別な処理を必要としないファイルは、最終的に製品にコピーされます。
(07:35)copyセマンティクスはより直接的です。バイトをコピーし、変換は行いません。セッションによって指定される一般的なシナリオは、ディレクトリ構造全体を保存するか、ランタイム テンプレートとしてコンパイルされた可能性のあるソース ファイルを使用することです。
これら 2 つのオプションの主な違いは、マニフェストの決定に単純化できます。
.process("Logo.png")
.copy("Game Data")
キーポイント:
processこれは、Xcode がプラットフォームの組み込みルールを使用できるようにするため、デフォルトの優先リソース アクションです。 -copyリソース ディレクトリ構造の適合自体は、ランタイム プロトコルの一部です。- どちらもターゲットに属します
resources宣言されているパッケージ ターゲットをスコープとする配列。
Bundle.module はモジュール内のリソースの入り口です
(07:59) ビルドすると、ターゲットのソース ファイルがコード モジュールにコンパイルされ、ターゲットのリソースがモジュールに対応するリソース バンドルに処理されます。 Apple プラットフォーム上のアプリと拡張機能自体はバンドルであり、パッケージのリソース バンドルはアプリ バンドルに埋め込まれます。コマンド ライン ツールなどのバンドルされていない製品では、ツールの隣にリソース バンドルをインストールする必要があります。
(09:38) Foundation の機能を使用して実行時にリソースにアクセスするBundleAPI。 Xcode はリソースを含むパッケージ ターゲットのバンドル アクセサーを合成し、Swift モジュールと Objective-C モジュールの両方が対応するバンドルを取得できます。 Swift の一般的なエントリ ポイントは次のとおりです。
let logoURL = Bundle.module.url(forResource: "Logo", withExtension: "png")
キーポイント:
Bundle.module現在のコード モジュールに対応するリソース バンドルを返します。 -url(forResource:withExtension:)これは既存の Foundation API であり、パッケージ リソースに対して新しいリソース検索モデルは導入されていません。- このアクセサーは、同じモジュール内のコードにのみ表示されます。
- 他のモジュールがリソースを必要とする場合、バンドル全体がパブリック依存関係として公開されることを避けるために、セッションはアクセサーに特定の画像や特定のデータ ファイルを返すなどの明確なタイプを提供することをお勧めします。
ローカライズされたリソースは、defaultLocalization と .lproj を使用します
(11:27) Xcode 12 は、パッケージ内のローカライズされたリソースもサポートします。最初のステップは、マニフェストでデフォルトの開発言語を宣言することです。この言語は、実行時により適切な言語が利用できない場合のフォールバックとして機能します。
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "DiceUI",
defaultLocalization: "en",
targets: [
.target(name: "DiceUI")
]
)
キーポイント:
defaultLocalization: "en"パッケージのデフォルトのローカリゼーション言語を宣言します。- セッションは、リソースを含むパッケージがデフォルトのローカリゼーションを宣言する必要があることを明示的に示します。
- 言語 ID は、Apple プラットフォームのローカリゼーションと同じ言語識別ルールを使用します。
(12:02) 次に、en.lprojそしてfr.lproj、各ディレクトリに置きますLocalizable.strings。.lprojこのサフィックスにより、Xcode はこれがローカリゼーション ディレクトリであることを認識できるため、通常はマニフェストでは使用されません。resources別に記載されています。
Sources/DiceUI/en.lproj/Localizable.strings
Sources/DiceUI/fr.lproj/Localizable.strings
キーポイント:
Localizable.stringsキーのターゲット言語テキストへのマッピングを保存します。 -.stringsdict複数形化などのルールのためにローカリゼーション ディレクトリに配置することもできます。- ローカリゼーション ディレクトリには、言語固有のバージョンのリソースを含めることもできます。
- アセット カタログ自体をローカライズして、さまざまな言語でさまざまな画像を提供することもできます。
(13:01) SwiftUI テキストは、モジュール バンドルを通じてローカライズされた文字列も取得します。
Text("roll", bundle: .module)
キーポイント:
"roll"はローカライゼーション キーで、セッション内の英語のマッピングは次のとおりです。roll, フランス語は、対応する翻訳にマッピングされます。 -bundle: .moduleパッケージのリソース バンドルで文字列を検索するように SwiftUI に指示します。- SwiftUI プレビューは環境を通じて言語をオーバーライドできます。セッションはフランス語でプレビューされ、パッケージ内の文字列が有効になることを確認します。
重要ポイント
-
やるべきこと: UI を備えた共有コンポーネントを実際に Swift パッケージにカプセル化します。 実行する価値がある理由: Xcode 12 では、パッケージ ターゲットにアセット カタログを含めることができ、SwiftUI プレビューではクライアント アプリなしでワークスペースにリソースを表示することもできます。 開始方法: コンポーネント自身のイメージをターゲットの隣のアセット カタログに配置し、イメージをロードするときにそれを渡します。
bundle: .module。 -
内容: サンプル データ、テンプレート ファイル、またはゲーム レベルをパッケージに入れます。 実行する価値がある理由: マニフェストは区別できる
.processそして.copy、ランタイム データはクライアント アプリのディレクトリ規則に依存する必要がなくなりました。 開始方法: プラットフォーム処理を必要とするリソースを使用する.process(...)、ディレクトリ階層を保持する必要があるリソースに使用されます。.copy(...)。 -
内容: パッケージ用の狭いリソース アクセス API を提供します。 実行する価値がある理由:
Bundle.module同じモジュール内でのみ表示されるため、セッションはバンドル全体を他のモジュールに公開しないことも推奨されます。 開始方法: パッケージ内に書き込みますImageProvider、TemplateLoaderまたは、呼び出し元が実際に必要とする画像、URL、またはデータのみを返す同様のタイプ。 -
内容: 再利用可能なコンポーネントに独自のローカライズされた文字列を導入させます。 実行する価値がある理由: パッケージを宣言できる
defaultLocalization、そして持ち運びます.lproj下Localizable.stringsそして.stringsdict。 開始方法: まずデフォルト言語用に作成しますen.lproj/Localizable.strings、次にターゲット言語ディレクトリを追加し、SwiftUI テキストを使用しますbundle: .module。 -
やるべきこと: パッケージ内のさまざまな言語で UI をプレビューします。 実行する価値がある理由: このセッションでは、SwiftUI プレビュー環境を通じて言語の範囲を示し、フランス語の文字列が生成されたリソース バンドルからのものであることを直接検証します。 開始方法: ローカライズされたプレビューをキー ビューに追加します。ロケールをオーバーライドした後、ボタンのコピー、画像、レイアウトが正しいかどうかを確認してください。
関連セッション
- バイナリ フレームワークを Swift パッケージとして配布する — Swift Package Manager が Xcode 12 でプリコンパイルされた XCFramework を配布する方法を引き続き確認します。
- Xcode Playgrounds でパッケージとプロジェクトを探索する — Xcode 12 の最新のビルド システムがプレイグラウンド、パッケージ、フレームワーク、リソースをどのように処理するかを学びます。
- フォーマッタ: データを人間にとって使いやすいものにする — 日付、単位、名前、リスト、数値、stringsdict をシステムにローカライズする方法を学びます。
- Xcode を使用してローカリゼーションに適したレイアウトを構築する — 翻訳の長さ、右から左へ記述する言語、および Xcode ローカリゼーション レイアウト プレビューに関する作業を継続しています。
- Swift の新機能 — Swift 5.3、パッケージ エコシステム、開発者エクスペリエンスの更新の全体的な背景に戻ります。
コメント
GitHub Issues · utterances