すべてではないにしても、ほとんどの Swift 開発者は、Swift の 監視する マシンへのエントリの忠実な調達に慣れています。 これにより、コードの実装の脆弱な印刷物を覆い隠し、コードがアクセスされる可能性がある放射インターフェイス (いわゆる API) を作成することができます。 この方法論はかなり異常ですが、API をさまざまな消費条件に合わせてカスタマイズしなければならない場合、残念ながらその限界に達します。これは、3 回目のお祝いの買い物客のためのより洗練されたパブリック API を保護しながら、内部製品の一連の公開インターフェイスを拡張することに相当します。 幸いなことに、実験的な @_spi
属性という答えがあります。これについては、この投稿でもう少し詳しく説明します
。インテンション プログラミング インターフェース
インテンション プログラミング インターフェース (SPI) は非常に珍しいツール エンジニアリング用語であり、API の形式を指します。それは、見込み客のエビのピクルスを適切に公開し、他の人のために隠します。 その一例が Apple のマシン フレームワークです。これは、効果的に概説された調達用パブリック API を気に入っていますが、さまざまな Apple フレームワークとアプリケーション専用であると想定されている追加機能についても適度に明らかにしています。とはいえ、Apple はこのようなニーズを持っている最高の会社ではありません。 PSPDFKit では、
バイナリ iOS フレームワークのピクルも配布しています。 これらは、PDF API を備えたモデル層フレームワーク、UI フレームワーク、および必須ではないさまざまなアドオン フレームワークを網羅しています。 それらはすべて、私たちの見込み客のために想定されているパブリック API を喜んでいますが、ヘルパーのより良い統合と再利用を促進するために内部フックを必要とするのと同じくらい効果的です。 これらのフレームワークの上に、私たちは停止者アプリケーション (PDF Viewer) も構築しました。まだ適切な見通しを明らかにする準備ができていません.@_spi 属性
@_spi 属性
Purpose-C では、SPI は、非パブリック アンブレラ ヘッダーを作成することによって概説されます。 そのヘッダーは、内部の依存関係からアクセスできるようになりますが、3 番目のイベントには分配されません。 この信念は、非公開モジュール マップ を貸してくれる Swift API ショッパーによって適切なものになる可能性があります。 @_spi
属性が最初に 言語.
属性
@_spi
属性は、まったく新しい構文を定義します。個人化された名前で公開宣言に注釈を付けます。 これにより、同一のモジュールから、および同一の
@_spi
名でモジュールをインポートする購入者が、マークされた API に最も簡単にアクセスできるようになります。
例として、以下のコード内で、PSPDFKit.framework( の public 特性である
helper()
を作成しています。 、
Internal
SPI のシェア:
@_spi (内部) 公共 func helper() {}
helper() を PSPDFKit.framework の外側に拡張するには*)、次のようにインポートする必要があります:
@_spi (内部) 輸入 PSPDFキット
ここでは、のexpendのpickleで実行されますインポート PSPDFKit
.
Module Interface
上記のインスタンスワークを作成するには、PSPDFKit.frameworkが必要セカンダリ Swift インターフェイス (.non-public.swiftinterface) を従来の .swiftinterface と同じくらい効果的に生成する*))。 ここでは、-emit-non-public-module-interface-direction コンパイラ選択の側で実行されます。 このファイルは、場合によっては内部依存関係に組み込まれる可能性もありますが、フレームワークを 3 番目のイベントに配布するときに削除されます。 これはハンドブックの後処理ステップですが、純粋な Swift 製品の不便さを解消するためのものです.
Purpose-C との互換性
@objc
属性は、生成された -Swift.h ヘッダーを介して目的 C に公開されます。 現在、生成されたヘッダーの最終的なパブリック モデルと非パブリック モデルの間に区別がないため、SPI は生成されたヘッダー内で停止します。 したがって、これらの宣言を手動で表現するには、もう 1 つの後処理ステップが必要です。
危険
Apple の API 命名規則に慣れている人なら誰でも、今のところ、アンダースコアのプレフィックスを叫び声として賞賛するでしょう。 Swift の下線付き API は非公開と見なされます。つまり、構文とセマンティクスの安定性が保証されていません。 逆説的に言えば、Swift 言語の SPI を活用して、SPI での喜びをモデル化する必要があります
を参照) Underscored Attributes Reference。これは @_spi の主要な参照レベルです。 、ドキュメンテーションの一番上に目障りで特定の警告を見つけます:
警告: このファイルは、基本的にコンパイラおよび従来のライブラリ開発者向けに用意されています。 Swift monorepo 外でこれらの属性を使用することは強くお勧めしません.
とはいえ、この API がすべての Apple 社内ですでに弱体化していることも確かであり、いくつかの 3 番目のイベントが気に入っています ストライプフレームワーク
. この API が将来よく取引される可能性があることは承知していますが、これは定期的に調達と見なされており、現在のところ、SPI を作成するための最良の図であるというかなり確実なヒントを受け取りました。 Swift. 準最適としてテスト可能of
Swift は、見守るために API を変更する言語卒業証書のもう 1 つの特徴を喜んでいます: @testable
インポート属性。 これは、テスト可能性を元にした大気を有効にして構築すること (-enable-checking out
フラグ) と組み合わせて、範囲へのエントリの忠実な調達をパブリックに引き上げます。 ある意味では、@testable は、常にテスト容易性を有効にしてコンパイルし、@testable は、SPI が必要な取得をインポートします。警告。 コードは本番ビルドでもテスト容易にコンパイルされることを望んでいるため、公開しています all 内部シンボル — SPI ショッパーには適切ではありませんが、 @testable import でフレームワークをインポートする人。 これにより、カプセル化が減少し、コードの起動が (偶発的な) 誤用につながります。
@_spi
の設計フォワード
SPI の関心領域の性質の結果として、@_spi
は、忠実な性格からすぐに公的な性格に発展します。 Swift 言語エンジニアと話をしたところ、SPI を言語特性として描写するためのより大きな図があることを彼らが考えていることがわかりましたが、それがどれほど正確に見えるかはまだわかっていません。
以上のことから、私たちは — 今こそ — これが私たちの懸念を解決するための最適な図であると判断し、ラントを許可しました。将来的に機能のリファクタリングが必要になる可能性は間違いありません。 最悪の事態が発生し、特性が完全に解消された場合は、@testable.
に降下援助を落ち着かせることができます。 𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺
func helper() {}
helper()
を
PSPDFKit.framework
の外側に拡張するには*)、次のようにインポートする必要があります:
@_spi (内部) 輸入 PSPDFキット
ここでは、のexpendのpickleで実行されますインポート PSPDFKit
@_spi(内部) 輸入
PSPDFキットここでは、のexpendのpickleで実行されますインポート PSPDFKit
.
Module Interface
上記のインスタンスワークを作成するには、PSPDFKit.framework
が必要セカンダリ Swift インターフェイス (
.non-public.swiftinterface
) を従来の
.swiftinterface
と同じくらい効果的に生成する*))。 ここでは、
-emit-non-public-module-interface-direction
コンパイラ選択の側で実行されます。 このファイルは、場合によっては内部依存関係に組み込まれる可能性もありますが、フレームワークを 3 番目のイベントに配布するときに削除されます。 これはハンドブックの後処理ステップですが、純粋な Swift 製品の不便さを解消するためのものです.
Purpose-C との互換性
@objc
属性は、生成された -Swift.h ヘッダーを介して目的 C に公開されます。 現在、生成されたヘッダーの最終的なパブリック モデルと非パブリック モデルの間に区別がないため、SPI は生成されたヘッダー内で停止します。 したがって、これらの宣言を手動で表現するには、もう 1 つの後処理ステップが必要です。
危険
Apple の API 命名規則に慣れている人なら誰でも、今のところ、アンダースコアのプレフィックスを叫び声として賞賛するでしょう。 Swift の下線付き API は非公開と見なされます。つまり、構文とセマンティクスの安定性が保証されていません。 逆説的に言えば、Swift 言語の SPI を活用して、SPI での喜びをモデル化する必要があります
を参照) Underscored Attributes Reference。これは @_spi の主要な参照レベルです。 、ドキュメンテーションの一番上に目障りで特定の警告を見つけます:
警告: このファイルは、基本的にコンパイラおよび従来のライブラリ開発者向けに用意されています。 Swift monorepo 外でこれらの属性を使用することは強くお勧めしません.
とはいえ、この API がすべての Apple 社内ですでに弱体化していることも確かであり、いくつかの 3 番目のイベントが気に入っています ストライプフレームワーク
. この API が将来よく取引される可能性があることは承知していますが、これは定期的に調達と見なされており、現在のところ、SPI を作成するための最良の図であるというかなり確実なヒントを受け取りました。 Swift. 準最適としてテスト可能of
Swift は、見守るために API を変更する言語卒業証書のもう 1 つの特徴を喜んでいます: @testable
インポート属性。 これは、テスト可能性を元にした大気を有効にして構築すること (-enable-checking out
フラグ) と組み合わせて、範囲へのエントリの忠実な調達をパブリックに引き上げます。 ある意味では、@testable は、常にテスト容易性を有効にしてコンパイルし、@testable は、SPI が必要な取得をインポートします。警告。 コードは本番ビルドでもテスト容易にコンパイルされることを望んでいるため、公開しています all 内部シンボル — SPI ショッパーには適切ではありませんが、 @testable import でフレームワークをインポートする人。 これにより、カプセル化が減少し、コードの起動が (偶発的な) 誤用につながります。
@_spi
の設計フォワード
SPI の関心領域の性質の結果として、@_spi
は、忠実な性格からすぐに公的な性格に発展します。 Swift 言語エンジニアと話をしたところ、SPI を言語特性として描写するためのより大きな図があることを彼らが考えていることがわかりましたが、それがどれほど正確に見えるかはまだわかっていません。
以上のことから、私たちは — 今こそ — これが私たちの懸念を解決するための最適な図であると判断し、ラントを許可しました。将来的に機能のリファクタリングが必要になる可能性は間違いありません。 最悪の事態が発生し、特性が完全に解消された場合は、@testable.
に降下援助を落ち着かせることができます。 𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺
Purpose-C との互換性
@objc
属性は、生成された -Swift.h
ヘッダーを介して目的 C に公開されます。 現在、生成されたヘッダーの最終的なパブリック モデルと非パブリック モデルの間に区別がないため、SPI は生成されたヘッダー内で停止します。 したがって、これらの宣言を手動で表現するには、もう 1 つの後処理ステップが必要です。
危険
Apple の API 命名規則に慣れている人なら誰でも、今のところ、アンダースコアのプレフィックスを叫び声として賞賛するでしょう。 Swift の下線付き API は非公開と見なされます。つまり、構文とセマンティクスの安定性が保証されていません。 逆説的に言えば、Swift 言語の SPI を活用して、SPI での喜びをモデル化する必要があります
を参照) Underscored Attributes Reference。これは @_spi
の主要な参照レベルです。 、ドキュメンテーションの一番上に目障りで特定の警告を見つけます:
警告: このファイルは、基本的にコンパイラおよび従来のライブラリ開発者向けに用意されています。 Swift monorepo 外でこれらの属性を使用することは強くお勧めしません.
とはいえ、この API がすべての Apple 社内ですでに弱体化していることも確かであり、いくつかの 3 番目のイベントが気に入っています ストライプフレームワーク
. この API が将来よく取引される可能性があることは承知していますが、これは定期的に調達と見なされており、現在のところ、SPI を作成するための最良の図であるというかなり確実なヒントを受け取りました。 Swift. 準最適としてテスト可能of
Swift は、見守るために API を変更する言語卒業証書のもう 1 つの特徴を喜んでいます: @testable
インポート属性。 これは、テスト可能性を元にした大気を有効にして構築すること (-enable-checking out
フラグ) と組み合わせて、範囲へのエントリの忠実な調達をパブリックに引き上げます。 ある意味では、@testable は、常にテスト容易性を有効にしてコンパイルし、@testable は、SPI が必要な取得をインポートします。警告。 コードは本番ビルドでもテスト容易にコンパイルされることを望んでいるため、公開しています all 内部シンボル — SPI ショッパーには適切ではありませんが、 @testable import でフレームワークをインポートする人。 これにより、カプセル化が減少し、コードの起動が (偶発的な) 誤用につながります。
@_spi
の設計フォワード
SPI の関心領域の性質の結果として、@_spi
は、忠実な性格からすぐに公的な性格に発展します。 Swift 言語エンジニアと話をしたところ、SPI を言語特性として描写するためのより大きな図があることを彼らが考えていることがわかりましたが、それがどれほど正確に見えるかはまだわかっていません。
以上のことから、私たちは — 今こそ — これが私たちの懸念を解決するための最適な図であると判断し、ラントを許可しました。将来的に機能のリファクタリングが必要になる可能性は間違いありません。 最悪の事態が発生し、特性が完全に解消された場合は、@testable.
に降下援助を落ち着かせることができます。 𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺
警告: このファイルは、基本的にコンパイラおよび従来のライブラリ開発者向けに用意されています。 Swift monorepo 外でこれらの属性を使用することは強くお勧めしません.
とはいえ、この API がすべての Apple 社内ですでに弱体化していることも確かであり、いくつかの 3 番目のイベントが気に入っています ストライプフレームワーク
. この API が将来よく取引される可能性があることは承知していますが、これは定期的に調達と見なされており、現在のところ、SPI を作成するための最良の図であるというかなり確実なヒントを受け取りました。 Swift. 準最適としてテスト可能of
Swift は、見守るために API を変更する言語卒業証書のもう 1 つの特徴を喜んでいます: @testable
インポート属性。 これは、テスト可能性を元にした大気を有効にして構築すること (-enable-checking out
フラグ) と組み合わせて、範囲へのエントリの忠実な調達をパブリックに引き上げます。 ある意味では、@testable
は、常にテスト容易性を有効にしてコンパイルし、
@testable
は、SPI が必要な取得をインポートします。警告。 コードは本番ビルドでもテスト容易にコンパイルされることを望んでいるため、公開しています all 内部シンボル — SPI ショッパーには適切ではありませんが、
@testable import
でフレームワークをインポートする人。 これにより、カプセル化が減少し、コードの起動が (偶発的な) 誤用につながります。
@_spi
の設計フォワード
SPI の関心領域の性質の結果として、@_spi
は、忠実な性格からすぐに公的な性格に発展します。 Swift 言語エンジニアと話をしたところ、SPI を言語特性として描写するためのより大きな図があることを彼らが考えていることがわかりましたが、それがどれほど正確に見えるかはまだわかっていません。
以上のことから、私たちは — 今こそ — これが私たちの懸念を解決するための最適な図であると判断し、ラントを許可しました。将来的に機能のリファクタリングが必要になる可能性は間違いありません。 最悪の事態が発生し、特性が完全に解消された場合は、@testable
.