Swift 6.0 beta 日本語化計画 : Swift 6.0 beta
属性
Swift には、宣言に適用される属性と型に適用される属性の 2 種類の属性があります。属性は、宣言または型に関する追加情報を提供します。たとえば、関数宣言の discardableResult 属性は、関数が値を返すにもかかわらず、戻り値が使用されていない場合にコンパイラが警告を生成するべきではないことを示します。
属性の名前と、属性が受け入れるすべての引数が続く @ 記号を書くことで属性を指定します。
@<#attribute name#>
@<#attribute name#> ( <#attribute arguments#> )
いくつかの宣言属性は、属性と、それが特定の宣言にいかに適用するかに関する詳細な情報を指定する引数を受け入れます。これらの 属性の引数 は括弧で囲まれており、その形式は、所属する属性によって定義されます。
付属した (attached) マクロとプロパティラッパーも属性構文を使用します。マクロの展開方法については、マクロ展開式 を参照してください。プロパティ ラッパーについては、propertyWrapper を参照してください。
宣言にだけ宣言の属性を適用できます。
attached 属性をマクロ宣言に適用します。この属性の引数はマクロの役割を示します。複数の役割を持つマクロの場合は、attached マクロを役割ごとに 1 回ずつ複数回適用します。
この属性への最初の引数はマクロの役割を示します。
Peer macros
この属性への最初の引数として peer を記述します。マクロを実装する型は、PeerMacro プロトコルに準拠します。これらのマクロは、マクロが付属している (attached) 宣言と同じスコープで新しい宣言を生成します。たとえば、構造体のメソッドに peer マクロを適用すると、その構造体に追加のメソッドとプロパティを定義できます。
Member macros
この属性への最初の引数として member を記述します。マクロを実装する型は、MemberMacro プロトコルに準拠します。これらのマクロは、マクロが付属してている型または拡張機能のメンバーである新しい宣言を生成します。たとえば、構造体宣言に member マクロを適用すると、その構造体に追加のメソッドとプロパティを定義できます。
Member attribute
この属性の最初の引数として memberAttribute を記述します。マクロを実装する型は、MemberAttributeMacro プロトコルに準拠します。これらのマクロは、マクロが付属している型または拡張機能のメンバーに属性を追加します。
Accessor Macros
この属性への最初の引数として accessor を記述します。マクロを実装する型は、AccessorMacro プロトコルに準拠します。これらのマクロは、付属している格納されたプロパティに accessor を追加し、計算されたプロパティに変換します。
Extension macros
この属性への最初の引数として extension を記述します。マクロを実装する型は、ExtensionMacro プロトコルに準拠します。これらのマクロは、プロトコル準拠、where 句、およびマクロが付属されている型のメンバーである新しい宣言を追加できます。マクロがプロトコル準拠を追加する場合は、 conformances: 引数を含めて、それらのプロトコルを指定します。準拠リストには、プロトコル名、準拠リスト項目を参照する型エイリアス、または準拠リスト項目のプロトコル構成が含まれます。ネストされた型の extension マクロは、そのファイルの最上位レベルの拡張機能に展開されます。拡張機能、型エイリアス、または関数内にネストされた型に extension マクロを記述したり、extension マクロを使用して peer マクロを持つ拡張機能を追加したりすることはできません。
peer, member, および accessor マクロの役割には、マクロが生成するシンボルの名前をリストする names: 引数が必要です。マクロが <extension 内に宣言を追加する場合、extension マクロの役割にも names: 引数が必要です。マクロ宣言に names: 引数が含まれている場合、マクロの実装では、そのリストに一致する名前を持つシンボルのみを生成しなければなりません。ただし、マクロはリストされているすべての名前に対してシンボルを生成する必要はありません。その引数の値は、以下の 1 つ以上のリストです。
特別なケースとして、プロパティラッパーと同様に動作するマクロに prefixed ($) を記述できます。
特定の Swift 言語のバージョンまたは特定のプラットフォームとオペレーティング·システムのバージョンに、宣言の寿命を相対的に示すために、この属性を適用します。
available 属性は、常に2つ以上のカンマで区切られた属性引数のリストで表わされます。これらの引数は、以下のプラットフォームまたは言語の名前のいずれか一つで始まります。
アスタリスク(*) を使用して、上にリストしたすべてのプラットフォーム名上の宣言の使用可能である事を示すこともできます。Swift のバージョン番号を使用して利用可能性を指定する available 属性は、アスタリスクを使用できません。
残りの引数は、任意の順序で表示でき、重要なマイルストーンを含む宣言の寿命に関する追加情報を指定できます。
introduced: <#version number#>
version number (バージョン番号) は、1つから3つの正の整数で構成されており、ピリオドで区切られています。
deprecated: <#version number#>
オプションの version number (バージョン番号) は、1つから3つの正の整数で構成されており、ピリオドで区切られています。バージョン番号を省略すると、廃止が起こった時点を示すことなく、宣言が現在廃止されていることが示されます。バージョン番号を省略した場合は、コロン(:) も省略してください。
obsoleted: <#version number#>
version number (バージョン番号) は、1つから3つの正の整数で構成されており、ピリオドで区切られています。
message: <#message#>
message(メッセージ) は文字列リテラルで構成されています。
renamed: <#new name#>
new name(新しい名前) は、文字列リテラルで構成されています。
以下に示すように、 renamed 引数と unavailable 引数を指定して available 属性を型エイリアス宣言に適用して、フレームワークまたはライブラリのリリース間で宣言の名前が変更されたことを示すことができます。この組み合わせにより、宣言の名前が変更されたというコンパイル時エラーが発生します。
異なるプラットフォーム上および Swift の異なるバージョンで宣言の利用可能性を指定するために、一つの宣言上で複数の available 属性を適用できます。available 属性が適用される宣言は、属性が現在のターゲットと一致しないプラットフォームまたは言語のバージョンを指定する場合は無視されます。available 属性を複数使用する場合、有効な利用可能性はプラットフォームと Swift の利用可能性の組み合わせです。
available 属性が、プラットフォーム名または言語名の引数に加えて introduced 引数だけを指定している場合は、以下の省略構文を代わりに使用できます。
@available(<#platform name#> <#version number#>, *)
@available(swift <#version number#>)
available 属性の省略構文により、複数のプラットフォームの利用可能性を簡潔に表現できます。2つの形式は機能的に同等ですが、可能であれば省略形式が常に好まれます。
Swift のバージョン番号を使用して利用可能性を指定する available 属性では、宣言のプラットフォームの利用可能性を追加で指定することはできません。代わりに、Swift バージョンの利用可能性と 1 つ以上のプラットフォームの利用可能性を指定するために、別の available 属性を使用してください。
この属性を関数、メソッド、サブスクリプト、または計算されたプロパティに適用すると、シンボルの実装のコピーが、シンボルを呼び出したりアクセスしたりするプログラムに含まれます。この属性は、オペレーティングシステムに含まれている API など、プラットフォームの一部として出荷されるシンボルに注釈を付ける場合に使用します。この属性は、シンボルにアクセスするプログラムに実装のコピーを含めることで、遡及的に使用できるシンボルをマークします。実装をコピーすることは、クライアントへの出力 とも呼ばれます。
この属性は before: 引数を取り、このシンボルを提供するプラットフォームの最初のバージョンを指定します。これらのプラットフォームバージョンは、available 属性に指定したプラットフォームバージョンと同じ意味を持ちます。available 属性とは異なり、リストにはすべてのバージョンを参照するアスタリスク (*) を含めることはできません。たとえば、以下のコードを考えてみましょう。
上記の例では、iOS SDK は iOS 17 以降で someFunction( ) を提供します。さらに、SDK はバックデプロイメントを使用して someFunction( ) を iOS 16 で利用できるようにします。
この関数を呼び出すコードをコンパイルすると、Swift は関数の実装を見つける間接レイヤーを挿入します。この関数を含む SDK のバージョンを使用してコードを実行すると、SDK の実装が使用されます。それ以外の場合は、呼び出し元に含まれるコピーが使用されます。上記の例では、someFunction( ) を呼び出すと、iOS 17 以降で実行している場合は SDK の実装が使用され、iOS 16 で実行している場合は、呼び出し元に含まれる someFunction( ) のコピーが使用されます。
以下の基準を満たす関数、メソッド、サブスクリプト、計算されたプロパティは、バックデプロイできます。
この属性を関数またはメソッド宣言に適用すると、その結果を使用せずに、値を返す関数またはメソッドが呼び出されたときに、コンパイラの警告が表示されなくなります。
この属性をクラス、構造体、列挙型、またはプロトコルに適用して、その型のインスタンスを呼び出し可能な関数として処理します。この型は、dynamicallyCall(withArguments:) メソッド、 dynamicallyCall(withKeywordArguments:) メソッド、またはその両方を実装しなければなりません。
動的に呼び出し可能な型のインスタンスは、任意の数の引数を取る関数のように呼び出すことができます。
dynamicallyCall(withArguments:) メソッドの宣言は、 ExpressibleByArrayLiteral プロトコルに準拠する単一のパラメータを持たなければなりません。上記の例の [Int] のように。戻り値の型は任意の型にすることができます。
DynamicallyCall(withKeywordArguments:) メソッドを実装する場合、動的メソッド呼び出しにはラベルを含めることができます。
dynamicallyCall(withKeywordArguments:) メソッドの宣言は、 ExpressibleByDictionaryLiteral プロトコルに準拠した単一のパラメータを持たねばならず、戻り値の型は任意の型にすることができます。パラメータの Key は ExpressibleByStringLiteral でなければなりません。以前の例では、KeyValuePairs をパラメータ型として使用しているため、呼び出し元は重複するパラメータラベルを含めることができます。a と b は、呼び出しで複数回 repeat のため現れます。
両方の dynamicallyCall メソッドを実装する場合、メソッド呼び出しにキーワード引数が含まれるときには dynamicallyCall(withKeywordArguments:) が呼び出されます。それ以外の場合は、 dynamicallyCall(withArguments:) が呼び出されます。
動的呼び出し可能インスタンスは、dynamicallyCall メソッド実装の 1 つで指定した型と一致する引数と戻り値を使用してのみ呼び出すことができます。以下の例の呼び出しは、KeyValuePairs<String,String> をとる dynamicallyCall(withArguments:) の実装がないため、コンパイルされません。
repeatLabels(a: "four") // Error
この属性をクラス、構造体、列挙型、またはプロトコルに適用して、実行時にメンバーを名前で検索できるようにします。型は subscript(dynamicMember:) サブスクリプトを実装しなければなりません。
明示的なメンバ式では、名前付きのメンバに対応する宣言がない場合、式は型の subscript(dynamicMember:) サブスクリプトへの呼び出しとして解釈され、メンバに関する情報を引数として渡します。サブスクリプトは、キーパスまたはメンバー名のいずれかのパラメータを受け入れることができます。両方のサブスクリプトを実装する場合、キーパス引数を取るサブスクリプトが使用されます。
subscript(dynamicMember:) の実装は、KeyPath、WritableKeyPath、または ReferenceWritableKeyPath 型の引数を使用してキーパスを受け入れることができます。ExpressibleByStringLiteral プロトコルに準拠する型の引数 (ほとんどの場合は String) を使用して、メンバ名を受け入れることができます。サブスクリプトの戻り値の型は任意です。
メンバ名による動的メンバ検索を使用すると、他の言語から Swift にデータをブリッジするときなど、コンパイル時に型チェックできないデータの周りに包み込まれた型を作成できます。例えば:
キーパスによる動的メンバルックアップを使用して、コンパイル時の型チェックをサポートする方法で包み込む型を実装できます。例えば:
freestanding マクロの宣言に freestanding 属性を適用します。
この属性を構造体または列挙型宣言に適用して、型に加えることができる変更の種類を制限できます。この属性は、ライブラリエボリューション (library evolution) モードでコンパイルする場合にのみ許可されます。ライブラリの将来のバージョンでは、列挙型のケースまたは構造体の格納されたインスタンスプロパティを追加、削除、または並べ替えて宣言を変更することはできません。これらの変更は、nonfrozen 型では許可されますが、frozen 型では ABI 互換性を壊します。
ライブラリエボリューションモードでは、nonfrozen 構造体および列挙型のメンバを操作するコードは、ライブラリの将来のバージョンがその型のメンバの一部を追加、削除、または並べ替えても、再コンパイルせずに動作を継続できるようにコンパイルされます。コンパイラは、実行時に情報を検索したり、間接層を追加したりするなどの手法を使用してこれを可能にします。構造体または列挙型を frozen としてマークすると、パフォーマンスを得るためにこの柔軟性が失われます。ライブラリの将来のバージョンでは、型に対して限られた変更しか行えませんが、コンパイラは、型のメンバを操作するコードで追加の最適化を行うことができます。
frozen (凍結) された型、凍結された構造体の格納されたプロパティの型、および凍結された列挙型のケースの関連値は、public であるか、useableFromInline 属性でマークされていなければなりません。凍結された構造体のプロパティにはプロパティ監視者を設定できません。また、格納されたインスタンスプロパティの初期値を提供する式は、inlinable で説明した inlinable 関数と同じ制限に従わなければなりません。
コマンドラインでライブラリエボリューションモードを有効にするには、-enable-library-evolution オプションを Swift コンパイラに渡します。Xcode で有効にするには、Xcode ヘルプ の説明に従って、"配布用ビルドライブラリ" のビルド設定 (BUILD_LIBRARY_FOR_DISTRIBUTION)を Yes に設定します。
将来の列挙型 case の切り替え で説明されているように、frozen の列挙型の switch 文には default の case は必要ありません。frozen の列挙型を切り替えるときに default または @unknown default case を含めると、そのコードは決して実行されないため、警告が生成されます。
この属性を適用して、カスタムの GameplayKit コンポーネントプロパティを SpriteKit エディタの UI に公開します。この属性を適用することは、objc 属性も伴います。
この属性を関数、メソッド、計算されたプロパティ、サブスクリプト、コンビニエンス・イニシャライザ、またはデイニシャライザの宣言に適用して、その宣言の実装をモジュールの public インタフェースの一部として公開します。コンパイラは、呼び出し側サイトで、インライン化できるシンボルへの呼び出しをそのシンボルの実装のコピーに置き換えることができます。
インライン化できるコードは、任意のモジュールで宣言されている open と public シンボルを操作でき、また、 usableFromInline 属性でマークされている同じモジュール内で宣言されている、internal シンボルを操作できます。インライン化できるコードは、private シンボルや fileprivate シンボルを操作することはできません。
この属性は、関数内に入れ子にされている宣言、または fileprivate 宣言または private 宣言には適用できません。インライン化できる関数内で定義されている関数とクロージャは、この属性でマークすることはできませんが、暗黙的にはインライン可能です。
この属性を構造体、クラス、または列挙型宣言に適用して、プログラムフローの最上位のエントリポイントが含まれていることを示します。型は、引数を全くとらずに Void を返す main 型の関数を提供しなければなりません。例えば:
main 属性の要件を説明する別の方法は、この属性を書き込む型が、以下の架空のプロトコルに準拠する型と同じ要件を満たさなければならないということです。
実行可能ファイルを作成するためにコンパイルする Swift コードには、トップレベルのコード で説明したように、最大で 1 つのトップレベルのエントリポイントを含めることができます。
この属性をメソッド、プロパティ、サブスクリプト、またはイニシャライザの宣言に適用して、暗黙の objc 属性を抑制します。nonobjc 属性は、Objective-C で宣言を表すことは可能ですが、Objective-C コードで宣言を使用できないようにコンパイラに指示します。
この属性を拡張機能に適用すると、objc 属性で明示的にマークされていない拡張機能のすべてのメンバに適用されるのと同じ効果があります。
nonobjc 属性を使用して、objc 属性でマークされたクラス内のメソッドをブリッジするための循環性を解決し、objc 属性でマークされたクラス内のメソッドとイニシャライザのオーバーロードを許可します。
nonobjc 属性でマークされたメソッドは、objc 属性でマークされたメソッドをオーバーライドできません。ただし、objc 属性でマークされたメソッドは、nonobjc 属性でマークされたメソッドをオーバーライドできます。同様に、nonobjc 属性でマークされたメソッドは、objc 属性でマークされたメソッドのプロトコル要件を満たすことはできません。
クラスにこの属性を適用して、それはアプリケーションデリゲートであることを示します。この属性を使用するのは、NSApplicationMain(_:_:) 関数を呼び出すことと同じです。
この属性を使用しない場合は、以下のように NSApplicationMain(_:_:) 関数を呼び出すコードを最上位レベルに含む main.swift ファイルを提供します。
実行可能ファイルを作成するためにコンパイルする Swift コードには、トップレベルのコード で説明したように、最大で 1 つのトップレベルのエントリポイントを含めることができます。
クラスの格納された変数プロパティにこの属性を適用します。この属性では、プロパティのセッタはプロパティ自身の値の代わりに、copyWithZone(_:) メソッドで返されるプロパティの値の コピー を用いて合成されます。プロパティの型は NSCopying プロトコルに準拠していなければなりません。
NSCopying 属性は、Objective-C の copy プロパティ属性と同様の動作をします。
この属性を、NSManagedObject から継承したクラスのインスタンスメソッドまたは格納された変数プロパティに適用し、コアデータが、関連する実体の説明に基づいて実行時に動的にその実装を提供することを示します。NSManaged 属性でマークされたプロパティの場合、コアデータはまた実行時にも格納場所を提供します。この属性を適用すると、objc 属性も伴います。
Objective-C で表す事のできる、全ての宣言ー例えば、入れ子になっていないクラス、プロトコル、汎用でない列挙型 (整数の生の値型に制約される)、プロパティ及びクラスのメソッド (ゲッタとセッタを含む)、プロトコルおよびプロトコルの optional のメンバ、イニシャライザ、およびサブスクリプトにこの属性を適用します。objc 属性はコンパイラに、宣言は Objective-C のコードで使用可能であることを指示します。
この属性を拡張機能に適用すると、nonobjc 属性で明示的にマークされていないその拡張機能のすべてのメンバに適用されるのと同じ効果があります。
コンパイラは、Objective-C で定義された全てのクラスのサブクラスに objc 属性を暗黙的に追加します。ただし、サブクラスは汎用であってはならず、全ての汎用クラスから継承してはいけません。これらの基準を満たすサブクラスに objc 属性を明示的に追加して、後述するようにその Objective-C 名を指定することができます。objc 属性でマークされたプロトコルは、この属性でマークされていないプロトコルから継承できません。
objc 属性は、以下の場合にも暗黙的に追加されます。
列挙型に objc 属性を適用すると、それぞれの列挙型の case は、列挙型の名と case 名の連結として Objective-C のコードに公開されます。case 名の最初の文字は大文字になります。例えば、Swift の Planet 列挙型の venus という名前の case は PlanetVenus という名前の case として Objective-C のコードに公開されます。
objc 属性は、オプションで単一の属性引数を受け取り、これは識別子で構成されます。識別子は、objc 属性が適用される実体の Objective-C に公開される名前を指定します。この引数を使用すると、クラス、列挙型、列挙型の case、プロトコル、メソッド、ゲッタ、セッタ、イニシャライザに名前を付けることができます。クラス、プロトコル、または列挙型の Objective-C 名を指定する場合は、Objective-C でのプログラミング (Programming with Objective-C) の 表記規則 (Conventions) に記載したように、名前に 3 文字の接頭辞を付けます。以下の例では、 ExampleClass の enabled プロパティのゲッタを Objective-C コードに公開し、プロパティ自体の名前ではなく、isEnabled として公開しています。
詳細については、Objective-C への Swift のインポート (Importing Swift into Objective-C) を参照してください。
この属性をクラス宣言に適用して、objc 属性をクラスのすべての Objective-C 互換メンバ、その拡張機能、そのサブクラス、およびそのサブクラスのすべての拡張機能に暗黙的に適用します。
ほとんどのコードは、必要な宣言だけを公開するために、代わりに objc 属性を使用するべきです。多くの宣言を公開する必要がある場合は、それらを objc 属性を持つ拡張機能にグループ化することができます。objcMembers 属性は、Objective-C 実行時環境の内省機能を多用するライブラリにとって便利です。必要でないときに objc 属性を適用すると、バイナリサイズが大きくなり、パフォーマンスに悪影響を及ぼす可能性があります。
厳密な同時実行チェックを抑制するには、この属性を宣言に適用します。この属性は、以下の種類の宣言に適用できます。
インポート宣言では、この属性により、インポートされたモジュールの型を使用するコードの同時実行チェックの厳密さが緩和されます。具体的には、送信不可として明示的にマークされていないインポートされたモジュールの型は、送信可能な型を必要とするコンテキストで使用できます。
他の宣言では、この属性により、宣言されているシンボルを使用するコードの同時実行チェックの厳密さが緩和されます。同時実行チェックが最小限のスコープ内でこのシンボルを使用すると、Sendable 要件やグローバルアクターなど、そのシンボルによって指定された同時実行関連の制約はチェックされません。
この属性を以下のように使用すると、コードを厳密な同時実行チェックに移行しやすくなります。
その他の宣言では、厳密なチェックに移行していないクライアントがまだある場合は、同時実行関連の制約を宣言に追加するときに、preconcurrency 属性を追加します。すべてのクライアントが移行したら、preconcurrency 属性を削除します。
Objective-C からの宣言は、常に preconcurrency 属性でマークされているかのようにインポートされます。
この属性をクラス、構造体、または列挙型宣言に適用して、その型をプロパティラッパー (包み込むもの、 wrapper) として使用します。この属性を型に適用すると、型と同じ名前のカスタム属性が作成されます。その新しい属性をクラス、構造体、または列挙型のプロパティに適用して、ラッパー型のインスタンスを介してプロパティへのアクセスをラップ (wrap) します。この属性をローカルの格納された変数宣言に適用して、同じ方法で変数へのアクセスを包み込みます。計算された変数、グローバル変数、および定数ではプロパティラッパーを使用できません。
ラッパーは、wrappedValue インスタンスプロパティを定義しなければなりません。プロパティの 包みこまれた値 は、このプロパティのゲッタとセッタが公開する値です。ほとんどの場合、wrappedValue は計算された値ですが、代わりに格納された値にすることもできます。ラッパーは、そのラップされた値に必要な、基礎となる保管場所を定義し管理します。コンパイラは、ラップされたプロパティの名前の前にアンダースコア(_ ) を接頭辞として付けることで、ラッパー型のインスタンスの保管場所を合成します。たとえば、someProperty のラッパーは _someProperty として格納されます。ラッパーの合成保管場所のアクセス制御レベルは private です。
プロパティラッパーを持つプロパティには、willSet ブロックと didSet ブロックを含めることができますが、コンパイラの合成した get ブロックまたは set ブロックをオーバーライドすることはできません。
Swift は、プロパティラッパーの初期化のために 2 つの形式のシンタックスシュガーを提供します。ラップされた値の定義で代入構文を使用して、代入の右辺の式をプロパティラッパーのイニシャライザの wrappedValue パラメータへの引数として渡すことができます。また、属性をプロパティに適用するときに属性に引数を指定することもでき、それらの引数はプロパティラッパーのイニシャライザに渡されます。たとえば、以下のコードでは、SomeStruct は SomeWrapper が定義する各イニシャライザを呼び出します。
ラップされたプロパティの 投影値 は、プロパティラッパーが追加機能を公開するために使用できる 2 番目の値です。プロパティラッパー型の作成者は、その投影値の意味を決定し、投影値が公開するインターフェイスを定義する責任があります。プロパティラッパーから値を投影するには、 ProjectedValue インスタンスプロパティをラッパー型で定義します。コンパイラは、ラップされたプロパティの名前の前に接頭辞としてドル記号 ($) を付けることにより、投影値の識別子を合成します。たとえば、someProperty の投影値は $someProperty です。投影された値は、元のラップされたプロパティと同じアクセス制御レベルです。
この属性をクラス、構造体、列挙型に適用して、その型を結果ビルダーとして使用します。結果ビルダー は、入れ子にされたデータ構造体を段階的にビルドする型です。結果ビルダーを使用して、自然で宣言的な方法で入れ子にされたデータ構造を作成するためのドメイン固有言語 (DSL) を実装します。resultBuilder 属性の使用方法の例については、Result Builder を参照してください。
Result Builder は、以下で説明する静的メソッドを実装します。Result Builder の機能はすべて静的メソッドを通じて公開されるため、その型のインスタンスを初期化する必要は全くありません。結果ビルダーは、buildBlock(_:) メソッド、または buildPartialBlock(first:) メソッドと buildPartialBlock(accumulated:next:) メソッドの両方を実装しなければなりません。DSL で追加機能を有効にするその他のメソッドはオプションです。結果ビルダー型の宣言には、実際にはプロトコル準拠を含める必要はありません。
静的メソッドの説明では、プレースホルダーとして 3 つの型を使用します。Expression 型は Result Builder の入力の型のプレースホルダーであり、Component は部分的な結果 (result) の型のプレースホルダーであり、FinalResult は Result Builder が生成する結果の型のプレースホルダーです。これらの型を、Result Builder が使用する実際の型に置き換えます。結果構築 (result-building) メソッドで Expression または FinalResult の型を指定しない場合、デフォルトで Component と同じになります。
結果構築メソッドは以下のとおりです。
部分的な結果の配列を 1 つの部分的な結果に結合します。
最初のコンポーネントから部分的な結果コンポーネントを構築します。一度に 1 つのコンポーネントのビルディングブロックをサポートするには、このメソッドと buildPartialBlock(accumulated:next:) の両方を実装します。buildBlock(_:) と比較すると、このアプローチでは、異なる数の引数を処理する汎用オーバーロードの必要性が減ります。
結果ビルダーは、上記の 3 つのブロック構築メソッドをすべて実装できます。その場合、利用可能性によってどのメソッドが呼び出されるかが決まります。デフォルトでは、Swift は buildPartialBlock(first:) メソッドと buildPartialBlock(accumulated:next:) メソッドを呼び出します。代わりに Swift が buildBlock(_:) を呼び出すようにするには、buildPartialBlock(first:) と buildPartialBlock(accumulated:next:) に記述する利用可能性の前に、囲んでいる宣言を利用可能としてマークします。
追加の結果構築メソッドは以下のとおりです。
nil の可能性がある部分的な結果から部分的な結果を構築します。else 句を含まない if 文をサポートするには、このメソッドを実装します。
その値が何らかの条件に応じて変化する部分的な結果を構築します。switch 文と、else 句を含む if 文をサポートするには、このメソッドと buildEither(second:) の両方を実装します。
その値が何らかの条件に応じて変化する部分的な結果を構築します。switch 文と、else 句を含む if 文をサポートするには、このメソッドと buildEither(first:) の両方を実装します。
部分結果の配列から部分結果を構築します。for ループをサポートするには、このメソッドを実装します。
式から部分的な結果を構築します。このメソッドを実装すると、前処理 (式を internal 型に変換するなど) を実行したり、使用サイトで型推論のための追加情報を提供したりできます。
部分的な結果から最終的な結果を構築します。このメソッドは、部分的で最終的な結果に異なる型を使用する Result Builder の一部として実装することも、結果を返す前に結果に対して他の後処理を実行することもできます。
利用可能性チェックを実行するコンパイラ制御文の外側で型情報を伝播または消去する部分的な結果を構築します。これを使用して、条件分岐間で異なる型情報を消去できます。
たとえば、以下のコードは、整数の配列を構築する単純な Result Builder を定義します。このコードは、Component と Expression を型エイリアスとして定義し、以下の例を上記のメソッドのリストと簡単に一致できるようにします。
以下の構文変換は再帰的に適用され、Result Builder 構文を使用するコードを Result Builder 型の静的メソッドを呼び出すコードに変換します。
ただし、このアプローチでは、利用可能性チェックを行うコードで問題が発生します。
上記のコードでは、FutureText は DrawEither ジェネリック型の 1 つであるため、brokenDrawing 型の一部として表示されます。これにより、実行時に FutureText が使用できない場合、その型が明示的に使用されていない場合でも、プログラムがクラッシュする可能性があります。
この問題を解決するには、buildLimitedAvailability(_:) メソッドを実装して型情報を消去します。たとえば、以下のコードは、利用可能性チェックから AnyDrawable 値を構築します。
たとえば、3 つの case を持つ switch 文を作成すると、コンパイラは 3 つの葉のノードを持つバイナリツリーを使用します。同様に、根のノードから 2 番目の case へのパスは "2 番目の子"、次は "最初の子" であるため、その case は buildEither(first: buildEither(next: ... )) のような入れ子にされた呼び出しになります。以下の宣言は同等です。
変換動作は一時変数の観点から説明されていますが、Result Builder を使用しても、コードの残りの部分から見える新しい宣言は実際には作成されません。
Result Builder が変換するコードでは、break、continue、defer、guard、return 文、while 文、または do-catch 文を使用することはできません。
変換プロセスではコード内の宣言は変更されないため、一時的な定数や変数を使用して式を少しずつ構築できます。また、throw 文、コンパイル時診断文、return 文を含むクロージャも変更されません。
可能な限り、変換は合体します。たとえば、式 4 + 5 * 6 は、その関数を複数回呼び出すよりも、buildExpression(4 + 5 * 6) になります。同様に、入れ子にされた分岐文は、buildEither メソッドを呼び出す単一のバイナリツリーになります。
Result Builder 型を作成すると、同じ名前のカスタム属性が作成されます。この属性は以下の場所に適用できます。
Result Builder 属性を適用しても、ABI の互換性には影響しません。Result Builder 属性をパラメータに適用すると、その属性が関数のインターフェイスの一部となり、ソースの互換性に影響を与える可能性があります。
この属性をクラス宣言に適用して、クラス内のすべての格納されたプロパティに定義の一部としてデフォルト値を提供するように要求します。この属性は、NSManagedObject から継承した全てのクラスに対して推測されます。
この属性を import 宣言に適用して、モジュールのコードのテストを簡素化するそのアクセス制御への変更をそのモジュールにインポートします。internal アクセスレベル修飾子でマークされているインポートされたモジュール内の実体は、public アクセスレベル修飾子で宣言されているかのようにインポートされます。internal または public アクセスレベル修飾子でマークされたクラスとクラスメンバは、open アクセスレベル修飾子で宣言されているかのようにインポートされます。インポートされたモジュールは、テストを有効にしてコンパイルされなければなりません。
それがアプリケーション・デリゲートであることを示すために、クラスにこの属性を適用します。この属性を使用するのは、UIApplicationMain 関数を呼び出して、デリゲートクラスの名前として、このクラスの名前を渡すことと同じです。
この属性を使用しない場合は、UIApplicationMain(_:_:_:_:) (UIApplicationMain(_:_:_:_:)) 関数を呼び出す最上位レベルのコードで main.swift ファイルを指定して下さい。たとえば、アプリが UIApplication のカスタムサブクラスを principal クラスとして使用する場合、この属性を使用する代わりに UIApplicationMain(_:_:_:_:) 関数を呼び出します。
トップレベルのコード で説明されているように、実行可能ファイルを作成するためにコンパイルする Swift コードには、トップレベルのエントリポイントを 1 つだけ含めることができます。
この属性を、採用されたプロトコルの型宣言のリストの一部としてプロトコル型に適用すると、そのプロトコルの要件の適用が無効になります。
サポートされているプロトコルは Sendable のみです。
この属性を関数、メソッド、計算されたプロパティ、サブスクリプト、イニシャライザ、またはデイニシャライザの宣言に適用すると、宣言と同じモジュール内で定義されているインラインコードでそのシンボルを使用できます。宣言には internal アクセスレベル修飾子がなければなりません。usableFromInline とマークされた構造体またはクラスは、そのプロパティに public または usableFromInline の型のみを使用できます。usableFromInline とマークされた列挙型は、そのケースの生の値と関連する値に対して、public または usableFromInline である型のみを使用できます。
public アクセスレベル修飾子と同様に、この属性は宣言をモジュールの public インターフェイスの一部として公開します。public とは異なり、コンパイラは、宣言のシンボルが export されていても、usageFromInline でマークされた宣言をモジュール外のコード内で名前で参照することを許可しません。ただし、モジュール外のコードは、実行時の動作を使用して宣言のシンボルを操作できる可能性があります。
inlinable 属性でマークされた宣言は、inlinable (インライン化可能な) コードから暗黙的に使用可能です。inlinable または usableFromInline は internal 宣言に適用できますが、両方の属性を適用するとエラーになります。
この属性を最上位レベルの関数、インスタンスメソッド、クラス、または静的メソッドに適用すると、その関数またはメソッドが、モジュール名、型名、インスタンス変数、またはインスタンス定数などを前に付けずに使用された場合に警告を発します。この属性を使用すると、同じスコープ (scope) からアクセス可能な同じ名前の関数間のあいまいさを防ぐのに役立ちます。
たとえば、Swift 標準ライブラリには、comparable (比較可能な) 要素で最上位レベルの min(_:_:) (min(_:_:)) 関数と シーケンスの min( ) メソッドの両方が含まれています。sequence メソッドは、warn_unqualified_access 属性を使用して宣言されているため、Sequence 拡張機能内から一方または他方を使用しようとしたときの混乱を減らすのに役立ちます。
インターフェイスビルダーの属性は、Xcode と同期するようにインターフェイスビルダーで使用される宣言属性です。Swift は、以下のインターフェースビルダーの属性を提供しています。IBAction, IBSegueAction, IBOutlet, IBDesignable, および IBInspectable です。これらの属性は、Objective-C で対応する物と概念的に同じです。
IBOutlet と、IBInspectable 属性は、クラスのプロパティ宣言に適用されます。クラスのメソッド宣言には IBAction と IBSegueAction 属性を適用し、クラス宣言には IBDesignable 属性を適用して下さい。
IBAction, IBSegueAction, IBOutlet, IBDesignable, または IBInspectable 属性を適用しても、objc 属性を含みます。
型の属性は、型にだけ適用できます。
この属性は、引数なしでクロージャにその式を自動的に包み込むことにより、式の評価を遅延させるために適用されます。引数を取らず、式の型の値を返す関数型のパラメータ用に、関数またはメソッド宣言のパラメータの型にこの属性を適用して下さい。autoclosure 属性を使用する方法の例については、オートクロージャ 及び 関数型 を参照してください。
この属性を関数の型に適用して、その呼び出し規約(convention)を示します。
convention 属性は、常に以下の引数の1つと共に表示されます。
いくつかの例外はありますが、他の呼び出し規約が関数に必要な場合は、任意の呼び出し規約の関数を使用できます。汎用でないグローバル関数、ローカル変数をキャプチャしないローカル関数、またはローカル変数をキャプチャしないクロージャは、C 呼び出し規約に変換できます。その他の Swift 関数は、C 呼び出し規約に変換できません。Objective-C ブロック呼び出し規約を持つ関数は、C 呼び出し規約に変換できません。
この属性を関数またはメソッド宣言内のパラメータの型に適用して、後で実行するためにパラメータの値を格納できることを示します。これは、値が呼び出しの寿命を超えて存続できることを意味します。escaping 型属性を持つ関数型パラメータでは、プロパティまたはメソッドの場合、self. を明示的に使用する必要があります。escaping 属性の使用例については、クロージャのエスケープ を参照してください。
この属性を関数の型に適用して、関数またはクロージャが Sendable (送信可能) であることを示します。この属性を関数型に適用することは、非関数型を Sendable プロトコルに準拠させることと同じ意味を持ちます。
この属性は、関数またはクロージャが送信可能な値を予期する文脈で使用され、関数またはクロージャが sendable (送信可能) であるための要件を満たしている場合に、関数およびクロージャで推論されます。
送信可能な関数型は、対応する送信不可能な関数型のサブタイプです。
switch case 属性は switch の case にのみ適用できます。
この属性を switch case に適用して、コードがコンパイルされた時点で既知の列挙型のいずれの case とも一致しないと予想されることを示します。unknown 属性の使用方法の例については、将来の列挙型 case の切り替え を参照してください。