discardableResult
属性は、関数は値を返しますが、戻り値が使用されていない場合に、コンパイラが警告を生成しないことを示します。@
記号に続けて属性の名前と、属性が受け入れる引数を書き込むことにより、属性を指定します。()
)で囲まれ、その形式は属する属性によって定義されています。available
属性は、常に 2 つ以上のカンマ区切り(,
)の属性引数のリストを伴います。これらの引数は、次のプラットフォーム名または言語名のいずれかで始まります:iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
macCatalyst
macCatalystApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
swift
*
)を使用して、上記の全てのプラットフォーム名で宣言が使用可能だと示すこともできます。Swift のバージョン番号を使用してアベイラビリティを指定する available
属性では、アスタリスクを使用できません。unavailable
引数は、指定されたプラットフォームで宣言が使用できないことを示します。この引数は、Swift のアベイラビリティバージョンを指定している場合は使用できませんintroduced
引数は、宣言が導入された特定のプラットフォームまたは言語の最初のバージョンを示します。形式は次のとおりです:.
)で区切られた 1〜3 個の正の整数で構成されます。deprecated
引数は、宣言が非推奨になった特定のプラットフォームまたは言語の最初のバージョンを示します。形式は次のとおりです:.
)で区切られた 1〜3 個の正の整数で構成されます。バージョン番号を省略すると、deprecated がいつ発生したかについての情報を提供せずに、宣言が現在 deprecated になっていることのみを示します。バージョン番号を省略する場合は、コロン(:
)も省略してください。obsoleted
引数は、宣言が廃止された特定のプラットフォームまたは言語の最初のバージョンを示します。宣言が廃止されると、指定されたプラットフォームまたは言語から削除され、使用できなくなります。形式は次のとおりです:.
)で区切られた 1〜3 個の正の整数で構成されます。message
引数は、deprecated または obsoleted された宣言に使用した際に、コンパイラが表示する警告またはエラーのテキストメッセージを提供します。形式は次のとおりです:renamed
引数は、名前が変更された宣言の新しい名前を示すテキストメッセージを提供します。コンパイラは、名前が変更された宣言が使用された際にエラーを発行し、新しい名前を表示します。形式は次のとおりです:renamed
引数と unavailable
引数を持つ available
属性を適用することができます。この組み合わせにより、宣言の名前が変更されたというコンパイルエラーが発生します。available
属性を適用して、様々なプラットフォームおよび様々なバージョンの Swift のアベイラビリティを指定できます。属性が現在のターゲットと一致しないプラットフォームまたは言語バージョンを指定している場合、available
属性が適用される宣言は無視されます。複数の available
属性を使用する場合、有効なアベイラビリティは、プラットフォームと Swift のアベイラビリティの組み合わせです。available
属性がプラットフォームまたは言語名の引数に加えて introduced
引数を指定するだけの場合は、代わりに次の省略構文を使用できます:available
属性の省略構文は、複数のプラットフォームのアベイラビリティを簡潔に表しています。2 つの形式は機能的に同等ですが、可能な限り省略形が推奨されます。available
属性は、宣言のプラットフォームのアベイラビリティを追加で指定することはできません。代わりに、個別の available
属性を使用して、Swift バージョンのアベイラビリティと 1 つ以上のプラットフォームのアベイラビリティを指定します。dynamicallyCall(withArguments:)
メソッド、dynamicallyCall(withKeywordArguments:)
メソッド、またはその両方を実装する必要があります。dynamicallyCall(withArguments:)
メソッドの宣言には、上記の例の [Int]
のように、ExpressibleByArrayLiteralプロトコルに準拠する単一のパラメータが必要です。戻り値の型は任意の型にすることができます。dynamicallyCall(withKeywordArguments:)
メソッドを実装する場合は、動的メソッド呼び出しにラベルを含めることができます。dynamicallyCall(withKeywordArguments:)
メソッドの宣言には、ExpressibleByDictionaryLiteralプロトコルに準拠する単一のパラメータが必要で、戻り値の型は任意の型にすることができます。パラメータのKeyはExpressibleByStringLiteralに準拠する必要があります。前の例では、パラメータの型としてKeyValuePairsを使用しているため、呼び出し元は重複するパラメータラベルを含めることができます。つまり、a
と b
は、repeatLabels
の呼び出し時に複数回使用されています。dynamiclyCall
メソッドを実装する場合、メソッド呼び出しにキーワード引数が含まれていると、dynamicallyCall(withKeywordArguments:)
が呼び出されます。他の全ての場合、dynamicallyCall(withArguments:)
が呼び出されます。dynamicCall
メソッドの実装の 1 つで指定した型と一致する引数と戻り値を使用した場合にのみ呼び出すことができます。次の例の呼び出しは、KeyValuePairs<String, String>
を受け取る dynamicallyCall(withArguments:)
の実装がないため、コンパイルできません。subscript(dynamicMember:)
を実装する必要があります。subscript(dynamicMember:)
の呼び出しとして解釈され、メンバに関する情報を引数として渡します。subscript は、KeyPath またはメンバ名のいずれかでパラメータを受け取ることができます。両方の subscript を実装する場合、KeyPath 引数を取る subscript が使用されます。subscript(dynamicMember:)
の実装は、KeyPath、WritableKeyPath、または ReferenceWritableKeyPathの引数を使用して KeyPath を受け取ることができます。ExpressibleByStringLiteralプロトコル(ほとんどの場合、String
)に準拠する型の引数を使用して、メンバ名を受け入れることができます。subscript の戻り値の型は任意の型にすることができます。NOTE コンパイラが ライブラリエボリューションモードでない場合、全ての構造体と列挙型は暗黙的に frozen にされ、この属性は無視されます。
usableFromInline
属性がマークされている必要があります。frozen 構造体のプロパティはプロパティオブザーバを持つことができず、格納インスタンスプロパティの初期値を提供する式は、inlinableで説明されているように inlinable 関数と同じ制限に従う必要があります。-enable-library-evolution
オプションを Swift コンパイラに渡します。Xcode で有効にするには、Xcode Helpの説明に従って、「Build Libraries for Distribution」のビルド設定(BUILD_LIBRARY_FOR_DISTRIBUTION
)を Yes に設定します。default
または @unknown default
のケースを含めると、そのコードは実行されないため、警告が生成されます。objc
属性も暗黙的に追加されます。public
シンボルとやり取りし、usableFromInline
属性がマークされた同じモジュールで宣言された internal
シンボルとやり取りできます。inline 化したコードは、private
シンボルまたは fileprivate シンボルとやり取りできません。fileprivate
または private
宣言には適用できません。inlinable 関数内で定義された関数とクロージャは、この属性をマークすることはできませんが、暗黙的に inlinable です。Void
を返す main
型関数を提供する必要があります。例えば:main
属性の要件を記述する別の方法は、この属性を追加する型が、次の架空のプロトコルに準拠する型と同じ要件を満たさなければならないということです。objc
属性を抑制します。nonobjc
属性は、Objective-C で宣言を使用することができる場合でも、使用できないようにするようコンパイラに指示します。objc
属性が明示的にマークされていないその extension の全てのメンバに適用するのと同じ効果があります。nonobjc
属性を使用して、objc
属性がマークされたクラスのブリッジメソッドの循環性を解決し、objc
属性がマークされたクラスのメソッドとイニシャライザのオーバーロードを許可します。nonobjc
属性がマークされたメソッドは、objc
属性がマークされたメソッドをオーバーライドできません。ただし、objc
属性がマークされたメソッドは、nonobjc
属性がマークされたメソッドをオーバーライドできます。同様に、nonobjc
属性がマークされたメソッドは、objc
属性がマークされたメソッドのプロトコル要件を満たすことができません。NSApplicationMain(_:_:)
関数を呼び出すことと同じです。NSApplicationMain(_:_:)
関数を呼び出すトップレベルのコードを main.swift
ファイルに指定します。copyWithZone(_:)
メソッドによって返されるプロパティの値のコピーと同期されます。プロパティの型は、NSCopying
プロトコルに準拠している必要があります。NSCopying
属性は、Objective-C のコピープロパティ属性と同じように動作します。NSManagedObject
を継承するクラスのインスタンスメソッドまたは格納変数プロパティに適用すると、関連付けられたエンティティの記述に基づいて、CoreData が実行時にその実装を動的に提供することを示します。NSManaged
属性がマークされたプロパティの場合、CoreData は実行時にストレージも提供します。この属性を適用すると、objc
属性も暗黙的に追加されます。objc
属性は、Objective-C コードで宣言を使用できることをコンパイラに通知します。nonobjc
属性が明示的にマークされていないその extension 内の全てのメンバに適用するのと同じ効果があります。objc
属性を暗黙的に追加します。ただし、サブクラスはジェネリックにはできず、ジェネリッククラスから継承してはなりません。これらの条件を満たすサブクラスに objc
属性を明示的に追加して、下記で説明するように、その Objective-C 名を指定できます。objc
属性がマークされているプロトコルは、objc
属性がマークされていないプロトコルから継承できません。objc
属性がある場合objc
属性を持つプロトコルの要件を満たす場合IBAction
、IBSegueAction
、IBOutlet
、IBDesignable
、IBInspectable
、NSManaged
、または GKInspectable
属性がある場合objc
属性を列挙型に適用すると、各列挙ケースは、列挙型名とケース名を連結して Objective-C コードに公開されます。ケース名の最初の文字は大文字です。例えば、Swift では Planet
列挙型内の venus
という名前のケースは、PlanetVenus
という名前のケースとして Objective-C コードに公開されます。objc
属性は、任意で、識別子に単一の属性引数を受け取ります。識別子は、objc
属性が適用されるエンティティの Objective-C に公開される名前を指定します。この引数を使用して、クラス、列挙型、列挙ケース、プロトコル、メソッド、get、set、およびイニシャライザに名前を付けることができます。クラス、プロトコル、または列挙型に Objective-C 名を指定する場合は、Programming with Objective-CのConventionsで説明されているように、名前に 3 文字のプレフィックスを含めます。下記の例では、ExampleClass
の enabled
プロパティの get を、プロパティ自体の名前としてではなく、isEnabled
として Objective-C コードに公開しています。NOTEobjc
属性の引数は、その宣言の実行時名を変更することもできます。NSClassFromString
などの Objective-C ランタイムとやり取りする関数を呼び出すとき、およびアプリのInfo.plist
ファイルでクラス名を指定するときに、実行時名を使用します。引数を渡して名前を指定すると、その名前が Objective-C コードの名前および実行時名として使用されます。引数を省略すると、Objective-C コードで使用される名前は Swift コードの名前と一致し、実行時名は通常の Swift コンパイラの名前修飾規則に従います。
objc
属性を暗黙的に追加します。objc
属性を使用して、必要な宣言のみを公開する必要があります。多くの宣言を公開する必要がある場合は、objc
属性を持つ extension でグループ化できます。objcMembers
属性は、Objective-C ランタイムのリフレクション機能を多用するライブラリにとって便利です。必要のないときに objc
属性を適用すると、バイナリサイズが大きくなり、パフォーマンスに悪影響を与える可能性があります。wrappedValue
インスタンスプロパティを定義する必要があります。プロパティの_ラップされた値_は、このプロパティの get と set が公開する値です。ほとんどの場合、wrappedValue
は計算値ですが、代わりに格納値にすることもできます。ラッパは、ラップされた値に必要なストレージを定義および管理します。コンパイラは、ラップされたプロパティの名前の前にアンダースコア(_
)を付けることにより、ラッパ型のインスタンスのストレージを合成します。例えば、someProperty
のラッパは _someProperty
として格納されます。ラッパの合成ストレージのアクセス制御レベルは private
です。willSet
ブロックと didSet
ブロックを含めることができますが、コンパイラで合成された get
ブロックまたは set
ブロックをオーバーライドすることはできません。wrappedValue
パラメータとして渡すことができます。属性をプロパティに適用するときに属性に引数を指定することもでき、それらの引数はプロパティラッパのイニシャライザに渡されます。例えば、下記のコードでは、SomeStruct
は SomeWrapper
が定義する各イニシャライザを呼び出します。projectedValue
インスタンスプロパティを定義します。コンパイラは、ラップされたプロパティの名前の前にドル記号($
)を付けることにより、投影された値の識別子を合成します。例えば、someProperty
の投影された値は $someProperty
です。投影された値は、元のラップされたプロパティと同じアクセス制御レベルを持ちます。resultBuilder
属性の使用方法の例については、Result Builders(リザルトビルダ)を参照ください。buildBlock(_:)
メソッドが必要です。DSL の追加機能を有効にする他の方法は省略可能です。リザルトビルダ型の宣言には、プロトコルの準拠を含める必要はありません。Expression
型は、リザルトビルダの入力の型のプレースホルダで、Component
は、部分的な結果の型のプレースホルダで、FinalResult
は、リザルトビルダが生成する最終的な結果の型のプレースホルダです。これらの型を、リザルトビルダが使用する実際の型に置き換えます。リザルトビルダメソッドで Expression
または FinalResult
の型が指定されていない場合、デフォルトで Component
と同じになります。Compontent
と Expression
をタイプエイリアスとして定義し、下記の例を上記のメソッドのリストに簡単に一致させることができます。buildExpression(_:)
メソッドがある場合、各式はそのメソッドの呼び出しになります。この変換は常に最初に行われます。例えば、次の宣言は同等です:()
に評価されると解釈されます。代入を具体的に処理するために ()
型の引数を取る buildExpression(_:)
のオーバーロードを定義できますbuildLimitedAvailability(_:)
メソッドの呼び出しになります。この変換は、buildEither(first:)
、buildEither(second:)
、または buildOptional(_:)
の呼び出しに変換される前に行われます。buildLimitedAvailability(_:)
メソッドを使用して、取得する分岐に応じて変化する型情報を消去します。例えば、下記の buildEither(first:)
メソッドと buildEither(second:)
メソッドは、両方の分岐に関する型情報をキャプチャするジェネリック型を使用しますFutureText
は DrawEither
ジェネリック型の 1 つのため、brokenDrawing
の型の一部として使用されています。これにより、FutureText
が実行時に使用できない場合、その型が明示的に使用されていない場合でも、プログラムがクラッシュする可能性があります。buildLimitedAvailability(_:)
メソッドを実装して型情報を消去します。例えば、下記のコードは、アベイラビリティチェックから AnyDrawable
値を作成します。buildEither(first:)
メソッドと buildEither(second:)
メソッドへの一連のネストされた呼び出しになります。文の条件とケースはバイナリツリーのリーフノードにマッピングされ、文はルートノードからそのリーフノードへのパスをたどる buildEither
メソッドへのネストされた呼び出しになりますswitch
文を作成する場合、コンパイラは 3 つのリーフノードを持つバイナリツリーを使用します。同様に、ルートノードから 2 番目のケースへのパスは「2 番目の子」の「最初の子」のため、そのケースは buildEither(first: buildEither(second: ... ))
のようなネストされた呼び出しになります。次の宣言は同等です:else
句のない if
文のように、値を生成しない可能性のある分岐文は、buildOptional(_:)
の呼び出しになります。if
文の条件が満たされると、そのコードブロックが変換され、引数として渡されます。それ以外の場合、buildOptional(_:)
は引数として nil
を使用して呼び出されます。例えば、次の宣言は同等です:do
文は、buildBlock(_:)
メソッドの呼び出しになります。ブロック内の各文は一度に 1 つずつ変換され、buildBlock(_:)
メソッドの引数になります。例えば、次の宣言は同等です:for
ループは一時変数、for
ループ、buildArray(_:)
メソッドの呼び出し、に分かれます。新しい for
ループはシーケンスを繰り返し処理し、それぞれの部分的な結果をその配列に追加します。一時配列は、buildArray(_:)
メソッドの引数として渡されます。例えば、次の宣言は同等です:buildFinalResult(_:)
メソッドがある場合、最終結果はそのメソッドの呼び出しになります。この変換は常に最後に行われますbreak
、continue
、defer
、guard
、return
、while
、または do-catch
を使用することはできません。throw
文、コンパイル時の診断文、または return
文を含むクロージャも変更しません。4 + 5 * 6
は、その関数への複数の呼び出しではなく、buildExpression(4 + 5 * 6)
になります。同様に、ネストされた分岐文は、buildEither
メソッドへの呼び出しの単一のバイナリツリーになります。NSManagedObject
を継承する全てのクラスに対して推論されます。internal
修飾子がマークされているエンティティは、public
修飾子で宣言されているかのようにインポートされます。internal
または public
修飾子がマークされたクラスおよびクラスメンバは、open
修飾子で宣言されたかのようにインポートされます。インポートされたモジュールは、テストを有効にしてコンパイルする必要があります。UIApplicationMain
関数を呼び出し、このクラスの名前をデリゲートクラスの名前として渡すことと同じです。main.swift
ファイルに指定します。例えば、アプリが UIApplication
の独自のサブクラスをメインクラスとして使用している場合、この属性を使用する代わりに UIApplicationMain(_:_:_:_:)
関数を呼び出します。internal
修飾子が必要です。usedFromInline
がマークされた構造体またはクラスは、そのプロパティに public
または usableFromInline
の型のみを使用できます。usedFromInline
がマークされた列挙型は、そのケースの Raw Value と関連値に対して、public
または usableFromInline
の型のみを使用できます。public
修飾子と同様に、この属性はモジュールの公開インターフェイスの一部として宣言が公開されます。public
とは異なり、コンパイラは、宣言のシンボルがエクスポートされている場合でも、usableFromInline
がマークされた宣言をモジュール外のコードで参照することを許可しません。ただし、モジュール外のコードは、ランタイム時の動作を使用して宣言のシンボルとやり取りできることもあります。inlinable
属性がマークされた宣言は、inlinable コードから暗黙的に使用できます。inlinable
または usableFromInline
のいずれかを internal
宣言に適用できますが、両方の属性を適用するとエラーです。Sequence
の min()
メソッドの両方が含まれています。Sequence
メソッドは warn_unqualified_access
属性で宣言されており、Sequence
extension 内からどちらかを使用しようとするときの混乱を減らすのに役立ちます。IBAction
、IBSegueAction
、IBOutlet
、IBDesignable
、および IBInspectable
。これらの属性は、Objective-C の対応する属性と概念的に同じです。IBOutlet
属性と IBInspectable
属性はクラスのプロパティ宣言に適用できます。IBAction
属性と IBSegueAction
属性はクラスのメソッド宣言に適用でき、IBDesignable
属性はクラス宣言に適用できます。IBAction
、IBSegueAction
、IBOutlet
、IBDesignable
、または IBInspectable
属性を適用すると、objc
属性も暗黙的に追加されます。autoclosure
属性の使用方法の例については、AutoClosures(自動クロージャ)とFunction Type(関数型)を参照ください。convention
属性は、常に次のいずれかの引数で表示されます:swift
引数は、Swift 関数の参照を示します。これは、Swift の関数値の標準的な呼び出し規約ですblock
引数は、Objective-C 互換のブロック参照を示します。関数値は、ブロックオブジェクトへの参照として表されます。ブロックオブジェクトは、その呼び出し関数をオブジェクト内に埋め込む id
互換の Objective-C オブジェクトへの参照です。呼び出し関数は C 言語の呼び出し規約を使用しますc
引数は、C 言語関数の参照を示します。関数値はコンテキストを持たず、C 言語の呼び出し規約を使用しますescaping
属性を持つ関数型パラメータは、プロパティまたはメソッドに対して self
を明示的に使用する必要があります。escaping
属性の使用方法の例については、Escaping Closures(エスケープクロージャ)を参照ください。Sendable
の値を期待するコンテキストで使用され、 Sendable
の要件を満たしている場合、その関数またはクロージャは Sendable
だと推論されます。Sendable
な関数型は、対応する Sendable
ではない関数型のサブタイプです。unknown
属性の使用方法の例については、Switching Over Future Enumeration Cases(列挙型の将来のケースのスイッチング)を参照ください。GRAMMAR OF AN ATTRIBUTE attribute →@
attribute-name attribute-argument-clauseopt attribute-name → identifier attribute-argument-clause →(
balanced-tokensopt)
attributes → attribute attributesopt balanced-tokens → balanced-token balanced-tokensopt balanced-token →(
balanced-tokensopt)
balanced-token →[
balanced-tokensopt]
balanced-token →{
balanced-tokensopt}
balanced-token → 任意の識別子、キーワード、リテラル、または演算子 balanced-token →(
,)
,[
,]
,{
, または}
を除く任意の句読点