2024/8/17
laprasdrum.icon 買い出しなどなど
/icons/hr.icon
@_spi: System Programming Interface
Swift Testingのコードリーディング中に @_spi(ForToolsIntegrationOnly) というアノテーションをよく見かけるのが気になってた。
Swift言語側の仕様なのかなと思い調査したところ、上記のリンクを発見。
The @_spi Attribute
In Objective-C, an SPI would be defined by creating a private umbrella header. That header would be made available to internal dependencies but not distributed to third parties. This concept could then be made compatible with Swift API consumers with the help of private module maps. There used to be no built-in way to create the same for a pure Swift SPI — until early 2020, when the @_spi attribute was first introduced to the language.
@_spi 属性
Objective-C では、SPI はプライベート アンブレラ ヘッダーを作成することで定義されます。このヘッダーは内部依存関係で使用できるようになりますが、サードパーティには配布されません。このコンセプトは、プライベート モジュール マップの助けを借りて、Swift API コンシューマーと互換性を持たせることができます。2020 年初頭にこの @_spi 属性が言語に初めて導入されるまで、純粋な Swift SPI 用に同じものを作成する組み込みの方法はありませんでした。
Attribute
The @_spi attribute defines a new syntax, which is used to annotate public declarations with a custom name. This makes the marked API only accessible from the same module and by clients that import the module with the same @_spi name.
As an example, in the code below, we’re making helper(), a public function in PSPDFKit.framework, part of the Internal SPI:
@_spi(Internal) public func helper() {}
To use helper() outside of PSPDFKit.framework, we need to import it with the following:
@_spi(Internal) import PSPDFKit
This is done instead of using import PSPDFKit.
属性
この@_spi属性は、カスタム名でパブリック宣言に注釈を付けるために使用される新しい構文を定義します。これにより、マークされた API には、同じモジュールから、および同じ@_spi名でモジュールをインポートするクライアントからのみアクセスできるようになります。
例として、以下のコードでは、SPIPSPDFKit.frameworkのpublic関数であるhelper()をInternal SPIの一部にしています。
@_spi(Internal) public func helper() {}
PSPDFKit.frameworkの外部でhelper()を使用するには、次のようにインポートする必要があります。
@_spi(Internal) import PSPDFKit
これはimport PSPDFKitを使用する代わりに行われます。