Swift 5.3 日本語化計画 : Swift 5.3
属性
Swift には、宣言に適用される属性と型に適用される属性の 2 種類の属性があります。属性は、宣言または型に関する追加情報を提供します。たとえば、関数宣言の discardableResult 属性は、関数が値を返すにもかかわらず、戻り値が使用されていない場合にコンパイラが警告を生成するべきではないことを示します。
属性の名前と、属性が受け入れるすべての引数が続く @ 記号を書くことで属性を指定します。
@
@ ( )
いくつかの宣言属性は、属性と、それが特定の宣言にいかに適用するかに関する詳細な情報を指定する引数を受け入れます。これらの 属性の引数 は括弧で囲まれており、その形式は、所属する属性によって定義されます。
宣言の属性
宣言にだけ宣言の属性を適用できます。
available
- iOS
- iOSApplicationExtension
- macOS
- macOSApplicationExtension
- macCatalyst
- macCatalystApplicationExtension
- watchOS
- watchOSApplicationExtension
- tvOS
- tvOSApplicationExtension
- swift
特定の Swift 言語のバージョンまたは特定のプラットフォームとオペレーティング·システムのバージョンに、宣言の寿命を相対的に示すために、すべての宣言にこの属性を適用します。
available 属性は、常に2つ以上のカンマで区切られた属性引数のリストで表わされます。これらの引数は、以下のプラットフォームまたは言語の名前のいずれか一つで始まります。
アスタリスク(*) を使用して、上にリストしたすべてのプラットフォーム名上の宣言が使用可能であることを示すこともできます。Swift のバージョン番号を使用して利用可能性を指定する available 属性は、アスタリスクを使用できません。
残りの引数は、任意の順序で表示でき、重要なマイルストーンを含む宣言の寿命に関する追加情報を指定できます。
- unavailable 引数は、宣言が指定されたプラットフォーム上では利用できないことを示します。この引数は、Swift バージョンの利用可能性を指定するときには使用できません。
- introduced 引数は、宣言が導入された指定プラットフォームまたは言語の最初のバージョンを示します。これは以下の形式です:
- deprecated 引数は、宣言が廃止された、指定されたプラットフォームまたは言語の最初のバージョンを示します。これは以下の形式です:
- obsoleted 引数は、宣言が旧式となった、指定されたプラットフォームまたは言語の最初のバージョンを示します。宣言が旧式になると、それは指定されたプラットフォームまたは言語から削除され、使用できなくなります。この形式は次のとおりです。
- message 引数は、廃止されたまたは旧式の宣言の使用に関する警告やエラーを発するときに、コンパイラによって表示されるテキストメッセージを提供します。これは以下の形式です:
- renamed 引数は、名前が変更された宣言の新しい名前を示すテキストメッセージを提供します。名前を変更した宣言の使用に関するエラーを発するときには、新しい名前がコンパイラによって表示されます。これは以下の形式です:
- // First release
- protocol MyProtocol {
- // protocol definition
- }
- // Subsequent release renames MyProtocol
- protocol MyRenamedProtocol {
- // protocol definition
- }
- @available(*, unavailable, renamed:"MyRenamedProtocol")
- typealias MyProtocol = MyRenamedProtocol
introduced:
version number (バージョン番号) は、1つから3つの正の整数で構成されており、ピリオドで区切られています。
deprecated:
オプションの version number (バージョン番号) は、1つから3つの正の整数で構成されており、ピリオドで区切られています。バージョン番号を省略すると、宣言が廃止された時点を示すことなく、宣言が現在廃止されていることが示されます。バージョン番号を省略した場合は、コロン(:) も省略してください。
obsoleted:
version number (バージョン番号) は、1つから3つの正の整数で構成されており、ピリオドで区切られています。
message:
message(メッセージ) は文字列リテラルで構成されています。
renamed:
new name(新しい名前) は、文字列リテラルで構成されています。
以下に示すように、 renamed 引数と unavailable 引数を指定して available 属性を型のエイリアス宣言に適用して、フレームワークまたはライブラリのリリース間で宣言の名前が変更されたことを示すことができます。この組み合わせにより、宣言の名前が変更されたというコンパイル時エラーが発生します。
異なるプラットフォーム上および Swift の異なるバージョンで宣言の利用可能性を指定するために、一つの宣言上で複数の available 属性を適用できます。available 属性が適用される宣言は、属性が現在のターゲットと一致しないプラットフォームまたは言語のバージョンを指定する場合は無視されます。available 属性を複数使用する場合、有効な利用可能性はプラットフォームと Swift の利用可能性の組み合わせです。
available 属性が、プラットフォーム名または言語名の引数に加えて introduced 引数だけを指定している場合は、以下の省略構文を代わりに使用できます。
@available( , *)
@available(swift )
available 属性の省略構文により、複数のプラットフォームの利用可能性を簡潔に表現できます。2つの形式は機能的に同等ですが、可能であれば省略形式が常に好まれます。
- @available(iOS 10.0, macOS 10.12, *)
- class MyClass {
- // class definition
- }
Swift のバージョン番号を使用して利用可能性を指定する available 属性では、宣言のプラットフォームの利用可能性を追加で指定することはできません。代わりに、Swift バージョンの利用可能性と 1 つ以上のプラットフォームの利用可能性を指定するために、別の available 属性を使用してください。
- @available(swift 3.0.2)
- @available(macOS 10.12, *)
- struct MyStruct {
- // struct definition
- }
discardableResult
この属性を関数またはメソッド宣言に適用すると、その結果を使用せずに、値を返す関数またはメソッドが呼び出されたときに、コンパイラの警告が表示されなくなります。
dynamicCallable
この属性をクラス、構造体、列挙型、またはプロトコルに適用して、その型のインスタンスを呼び出し可能な関数として処理します。この型は、dynamicallyCall(withArguments:) メソッド、 dynamicallyCall(withKeywordArguments:) メソッド、またはその両方を実装しなければなりません。
動的に呼び出し可能な型のインスタンスは、任意の数の引数を取る関数のように呼び出すことができます。
- @dynamicCallable
- struct TelephoneExchange {
- func dynamicallyCall(withArguments phoneNumber: [Int]) {
- if phoneNumber == [4, 1, 1] {
- print("Get Swift help on forums.swift.org")
- } else {
- print("Unrecognized number")
- }
- }
- }
- let dial = TelephoneExchange()
- // Use a dynamic method call.
- dial(4, 1, 1)
- // Prints "Get Swift help on forums.swift.org".
- dial(8, 6, 7, 5, 3, 0, 9)
- // Prints "Unrecognized number".
- // Call the underlying method directly
- dial.dynamicallyCall(withArguments: [4, 1, 1])
dynamicallyCall(withArguments:) メソッドの宣言には、 ExpressibleByArrayLiteral プロトコルに準拠する単一のパラメータ (上記の例の [Int] など) を持たなければなりません。戻り値の型は任意の型にすることができます。
dynamicallyCall(withKeywordArguments:) メソッドを実装する場合は、動的メソッド呼び出し内にラベルを含めることができます。
- @dynamicCallable
- struct Repeater {
- func dynamicallyCall(withKeywordArguments pairs: KeyValuePairs<String, Int>) -> String {
- return pairs
- .map { label, count in
- repeatElement(label, count: count).joined(separator: " ")
- }
- .joined(separator: "\n")
- }
- }
- let repeatLabels = Repeater()
- print(repeatLabels(a: 1, b: 2, c: 3, b: 2, a: 1))
- // a
- // b b
- // c c c
- // b b
- // a
dynamicallyCall(withKeywordArguments:) メソッドの宣言は、 ExpressibleByDictionaryLiteral プロトコルに準拠した単一のパラメータを持たねばならず、戻り値の型は任意の型にすることができます。パラメータの Key は ExpressibleByStringLiteral でなければなりません。以前の例では、KeyValuePairs をパラメータ型として使用しているため、呼び出し元は重複するパラメータラベルを含めることができます。a と b は、呼び出しで複数回 repeat のため現れます。
両方の dynamicallyCall メソッドを実装する場合、メソッド呼び出しにキーワード引数が含まれるときには dynamicallyCall(withKeywordArguments:) が呼び出されます。それ以外の場合は、 dynamicallyCall(withArguments:) が呼び出されます。
動的呼び出し可能インスタンスは、dynamicallyCall メソッド実装の 1 つで指定した型と一致する引数と戻り値を使用してのみ呼び出すことができます。以下の例の呼び出しは、KeyValuePairs<String,String> をとる dynamicallyCall(withArguments:) の実装がないため、コンパイルされません。
dynamicMemberLookup
この属性をクラス、構造体、列挙型、またはプロトコルに適用して、実行時にメンバーを名前で検索できるようにします。型は subscripy(dynamicMemberLookup:) サブスクリプトを実装しなければなりません。
明示的なメンバ式では、名前付きのメンバに対応する宣言がない場合、式は型の subscripy(dynamicMemberLookup:) サブスクリプトへの呼び出しとして解釈され、メンバに関する情報を引数として渡します。サブスクリプトは、キーパスまたはメンバー名のいずれかのパラメータを受け入れることができます。両方のサブスクリプトを実装する場合、キーパス引数を取るサブスクリプトが使用されます。
subscript(dynamicMemberLookup:) の実装は、KeyPath、WritableKeyPath、または ReferenceWritableKeyPath 型の引数を使用してキーパスを受け入れることができます。ExpressibleByStringLiteral プロトコルに準拠する型の引数 (ほとんどの場合は String) を使用して、メンバ名を受け入れることができます。サブスクリプトの戻り値の型は任意です。
メンバ名による動的メンバ検索を使用すると、他の言語から Swift にデータをブリッジするときなど、コンパイル時に型チェックできないデータの周りに包み込まれた型を作成できます。例えば:
- @dynamicMemberLookup
- struct DynamicStruct {
- let dictionary = ["someDynamicMember": 325,
-    "someOtherMember": 787]
- subscript(dynamicMember member: String) -> Int {
- return dictionary[member] ?? 1054
- }
- }
- let s = DynamicStruct()
- // Use dynamic member lookup.
- let dynamic = s.someDynamicMember
- print(dynamic)
- // Prints "325"
- // Call the underlying subscript directly.
- let equivalent = s[dynamicMember: "someDynamicMember"]
- print(dynamic == equivalent)
- // Prints "true"
キーパスによる動的メンバルックアップを使用して、コンパイル時の型チェックをサポートする方法で包み込む型を実装できます。例えば:
- struct Point { var x, y: Int }
- @dynamicMemberLookup
- struct PassthroughWrapper<Value> {
- var value: Value
- subscript<T>(dynamicMember member: KeyPath<Value, T>) -> T {
- get { return value[keyPath: member] }
- }
- }
- let point = Point(x: 381, y: 431)
- let wrapper = PassthroughWrapper(value: point)
- print(wrapper.x)
frozen
この属性を構造体または列挙型宣言に適用して、型に加えることができる変更の種類を制限できます。この属性は、ライブラリエボリューション (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 を含めると、そのコードは決して実行されないため、警告が生成されます。
GKInspectable
この属性を適用して、カスタムの GameplayKit コンポーネントプロパティを SpriteKit エディタの UI に公開します。この属性を適用することは、objc 属性も伴います。
inlinable
この属性を関数、メソッド、計算されたプロパティ、サブスクリプト、コンビニエンス・イニシャライザ、またはデイニシャライザの宣言に適用して、その宣言の実装をモジュールの public インタフェースの一部として公開します。コンパイラは、呼び出し側サイトで、インライン化できるシンボルへの呼び出しをそのシンボルの実装のコピーに置き換えることができます。
インライン化できるコードは、任意のモジュールで宣言されている public シンボルと対話でき、また、 usableFromInline 属性でマークされている同じモジュール内で宣言されている、internal シンボルと対話できます。インライン化できるコードは、private シンボルや fileprivate シンボルとは対話することはできません。
この属性は、関数内に入れ子にされている宣言、または fileprivate 宣言または private 宣言には適用できません。インライン化できる関数内で定義されている関数とクロージャは、この属性でマークすることはできませんが、暗黙的にはインライン可能です。
main
この属性を構造体、クラス、または列挙型宣言に適用して、プログラムフローの最上位のエントリポイントが含まれていることを示します。型は、引数を全くとらずに Void を返す main 型の関数を提供しなければなりません。例えば:
- @main
- struct MyTopLevel {
- static func main() {
- // Top-level code goes here
- }
- }
main 属性の要件を説明する別の方法は、この属性を書き込む型が、次の架空のプロトコルに準拠する型と同じ要件を満たさなければならないということです。
- protocol ProvidesMain {
- static func main() throws
- }
実行可能ファイルを作成するためにコンパイルする Swift コードには、トップレベルのコード で説明したように、最大で 1 つのトップレベルのエントリポイントを含めることができます。
nonobjc
この属性をメソッド、プロパティ、サブスクリプト、またはイニシャライザの宣言に適用して、暗黙の objc 属性を抑制します。nonobjc 属性は、Objective-C で宣言を表すことは可能ですが、Objective-C コードで宣言を使用できないようにコンパイラに指示します。
この属性を拡張機能に適用すると、objc 属性で明示的にマークされていない拡張機能のすべてのメンバに適用されるのと同じ効果があります。
nonobjc 属性を使用して、objc 属性でマークされたクラス内のメソッドをブリッジするための循環性を解決し、objc 属性でマークされたクラス内のメソッドとイニシャライザのオーバーロードを許可します。
nonobjc 属性でマークされたメソッドは、objc 属性でマークされたメソッドをオーバーライドできません。ただし、objc 属性でマークされたメソッドは、nonobjc 属性でマークされたメソッドをオーバーライドできます。同様に、nonobjc 属性でマークされたメソッドは、objc 属性でマークされたメソッドのプロトコル要件を満たすことはできません。
NSApplicationMain
クラスにこの属性を適用して、それはアプリケーションデリゲートであることを示します。この属性を使用するのは、NSApplicationMain(_:_:) 関数を呼び出すことと同じです。
この属性を使用しない場合は、以下のように NSApplicationMain(_:_:) 関数を呼び出す最上位レベルのコードを main.swift ファイルに指定します。
- import AppKit
- NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
実行可能ファイルを作成するためにコンパイルする Swift コードには、トップレベルのコード で説明したように、最大で 1 つのトップレベルのエントリポイントを含めることができます。
NSCopying
クラスの格納された変数プロパティにこの属性を適用します。この属性では、プロパティのセッタはプロパティ自身の値の代わりに、copyWithZone(_:) メソッドで返されるプロパティの値の コピー を用いて合成されます。プロパティの型は NSCopying プロトコルに準拠していなければなりません。
NSCopying 属性は、Objective-C の copy プロパティ属性と同様に動作します。
NSManaged
この属性を、NSManagedObject から継承したクラスのインスタンスメソッドまたは格納された変数プロパティに適用し、コアデータが、関連する実体の説明に基づいて実行時に動的にその実装を提供することを示します。NSManaged 属性でマークされたプロパティの場合、コアデータはまた実行時にも格納場所を提供します。この属性を適用すると、objc 属性も伴います。
objc
Objective-C で表す事のできる、全ての宣言ー例えば、入れ子になっていないクラス、プロトコル、汎用でない列挙型 (整数の生の値型に制約される)、プロパティ及びクラスのメソッド (ゲッタとセッタを含む)、プロトコルおよびプロトコルの optional のメンバ、イニシャライザ、およびサブスクリプトにこの属性を適用します。objc 属性はコンパイラに、宣言は Objective-C のコードで使用可能であることを指示します。
この属性を拡張機能に適用すると、nonobjc 属性で明示的にマークされていないその拡張機能のすべてのメンバに適用されるのと同じ効果があります。
コンパイラは、Objective-C で定義された全てのクラスのサブクラスに objc 属性を暗黙的に追加します。ただし、サブクラスは汎用であってはならず、全ての汎用クラスから継承してはいけません。これらの基準を満たすサブクラスに objc 属性を明示的に追加して、後述するようにその Objective-C 名を指定することができます。objc 属性でマークされたプロトコルは、この属性でマークされていないプロトコルから継承できません。
objc 属性は、以下の場合にも暗黙的に追加されます。
- 宣言はサブクラスでのオーバーライドであり、スーパークラスの宣言には objc 属性があります。
- この宣言は、objc 属性を持つプロトコルからの要件を満たしています。
- 宣言には、IBAction、IBSegueAction、IBOutlet、IBDesignable、IBInspectable、NSManaged、 または GKInspectable 属性があります。
- class ExampleClass: NSObject {
- @objc var enabled: Bool {
- @objc(isEnabled) get {
- // Return the appropriate value
- }
- }
- }
列挙型に objc 属性を適用すると、それぞれの列挙型の case は、列挙型の名と case 名の連結として Objective-C のコードに公開されます。case 名の最初の文字は大文字になります。例えば、Swift の Planet 列挙型の venus という名前の case は PlanetVenus という名前の case として Objective-C のコードに公開されます。
objc 属性は、オプションで単一の属性引数を受け取り、これは識別子で構成されます。識別子は、objc 属性が適用される実体の Objective-C に公開される名前を指定します。この引数を使用すると、クラス、列挙型、列挙型の case、プロトコル、メソッド、ゲッタ、セッタ、イニシャライザに名前を付けることができます。クラス、プロトコル、または列挙型の Objective-C 名を指定する場合は、Objective-C でのプログラミング の 表記規則 に記載したように、名前に 3 文字の接頭辞を付けます。以下の例では、 ExampleClass の enabled プロパティのゲッタを Objective-C コードに公開し、プロパティ自体の名前ではなく、isEnabled として公開しています。
詳細については、Objective-C への Swift のインポート を参照してください。
0
objcMembers
この属性をクラス宣言に適用して、objc 属性をクラスのすべての Objective-C 互換メンバ、その拡張機能、そのサブクラス、およびそのサブクラスのすべての拡張機能に暗黙的に適用します。
ほとんどのコードは、必要な宣言だけを公開するために、代わりに objc 属性を使用するべきです。多くの宣言を公開する必要がある場合は、それらを objc 属性を持つ拡張機能にグループ化することができます。objcMembers 属性は、Objective-C 実行時環境の内省機能を多用するライブラリにとって便利です。必要でないときに objc 属性を適用すると、バイナリサイズが大きくなり、パフォーマンスに悪影響を及ぼす可能性があります。
propertyWrapper
この属性をクラス、構造体、または列挙型宣言に適用して、その型をプロパティラッパー (包み込むもの、 wrapper) として使用します。この属性を型に適用すると、型と同じ名前のカスタム属性が作成されます。その新しい属性をクラス、構造体、または列挙型のプロパティに適用して、ラッパー型のインスタンスを介してプロパティへのアクセスをラップ (wrap) します。ローカル変数とグローバル変数はプロパティラッパーを使用できません。
ラッパーは、wrappedValue インスタンスプロパティを定義しなければなりません。プロパティの 包みこまれた値 は、このプロパティのゲッタとセッタが公開する値です。ほとんどの場合、wrappedValue は計算値ですが、代わりに格納された値にすることもできます。ラッパーは、ラップされた値に必要な、何らかの基礎となる保管値を定義および管理します。コンパイラは、ラップされたプロパティの名前の前にアンダースコア(_ ) を付けることで、ラッパー型のインスタンスの格納場所を合成します。たとえば、 someProperty のラッパーは _someProperty として格納されます。ラッパーの合成格納場所のアクセス制御レベルは private です。
プロパティラッパーを持つプロパティには、willSet ブロックと didSet ブロックを含めることができますが、コンパイラの合成した get ブロックまたは set ブロックをオーバーライドすることはできません。
Swift は、プロパティラッパーの初期化のために 2 つの形式のシンタックスシュガーを提供します。ラップされた値の定義で割り当て構文を使用して、代入の右辺の式をプロパティラッパーのイニシャライザの wrappedValue パラメータへの引数として渡すことができます。また、属性をプロパティに適用するときに属性に引数を指定することもでき、それらの引数はプロパティラッパーのイニシャライザに渡されます。たとえば、以下のコードでは、SomeStruct は SomeWrapper が定義する各イニシャライザを呼び出します。
- @propertyWrapper
- struct SomeWrapper {
- var wrappedValue: Int
- var someValue: Double
- init() {
- self.wrappedValue = 100
- self.someValue = 12.3
- }
- init(wrappedValue: Int) {
- self.wrappedValue = wrappedValue
- self.someValue = 45.6
- }
- init(wrappedValue value: Int, custom: Double) {
- self.wrappedValue = value
- self.someValue = custom
- }
- }
- struct SomeStruct {
- // Uses init()
- @SomeWrapper var a: Int
- // Uses init(wrappedValue:)
- @SomeWrapper var b = 10
- // Both use init(wrappedValue:custom:)
- @SomeWrapper(custom: 98.7) var c = 30
- @SomeWrapper(wrappedValue: 30, custom: 98.7) var d
- }
ラップされたプロパティの 投影値 は、プロパティラッパーが追加機能を公開するために使用できる 2 番目の値です。プロパティラッパー型の作成者は、その投影値の意味を決定し、投影値が公開するインターフェイスを定義する責任があります。プロパティラッパーから値を投影するには、ラッパー型で ProjectedValue インスタンスプロパティを定義します。コンパイラは、ラップされたプロパティの名前の前にドル記号 ($) を付けることにより、投影値の識別子を合成します。たとえば、someProperty の投影値は $someProperty です。投影された値には、元のラップされたプロパティと同じアクセス制御レベルがあります。
- @propertyWrapper
- struct WrapperWithProjection {
- var wrappedValue: Int
- var projectedValue: SomeProjection {
- return SomeProjection(wrapper: self)
- }
- }
- struct SomeProjection {
- var wrapper: WrapperWithProjection
- }
- struct SomeStruct {
- @WrapperWithProjection var x = 123
- }
- let s = SomeStruct()
- s.x   // Int value
- s.$x // SomeProjection value
- s.$x.wrapper   // WrapperWithProjection value
requires_stored_property_inits
この属性をクラス宣言に適用して、クラス内に格納されているすべてのプロパティに定義の一部としてデフォルト値を提供するように要求します。この属性は、NSManagedObject から継承した全てのクラスに対して推測されます。
testable
この属性を import 宣言に適用して、モジュールのコードのテストを簡素化するそのアクセス制御への変更をそのモジュールにインポートします。internal アクセスレベル修飾子でマークされているインポートされたモジュール内の実体は、public アクセスレベル修飾子で宣言されているかのようにインポートされます。internal または public アクセスレベル修飾子でマークされたクラスとクラスメンバは、open アクセスレベル修飾子で宣言されているかのようにインポートされます。インポートされたモジュールは、テストを有効にしてコンパイルされなければなりません。
UIApplicationMain
それがアプリケーション・デリゲートであることを示すために、クラスにこの属性を適用します。この属性を使用するのは、UIApplicationMain 関数を呼び出して、デリゲートクラスの名前として、このクラスの名前を渡すことと同じです。
この属性を使用しない場合は、UIApplicationMain(_:_:_:) 関数を呼び出す最上位レベルのコードで main.swift ファイルを指定して下さい。たとえば、アプリが UIApplication のカスタムサブクラスを principal クラスとして使用する場合、この属性を使用する代わりに UIApplicationMain(_:_:_:) 関数を呼び出します。
usableFromInline
この属性を関数、メソッド、計算されたプロパティ、サブスクリプト、イニシャライザ、またはデイニシャライザの宣言に適用すると、宣言と同じモジュール内で定義されているインラインコードでそのシンボルを使用できます。宣言には internal アクセスレベル修飾子がなければなりません。usedFromInline とマークされた構造体またはクラスは、そのプロパティに public または usableFromInline の型のみを使用できます。 usedFromInline とマークされた列挙型は、そのケースの生の値と関連する値に対して、public または usableFromInline である型のみを使用できます。
public アクセスレベル修飾子と同様に、この属性は宣言をモジュールの public インターフェイスの一部として公開します。public とは異なり、コンパイラは、宣言のシンボルが export されていても、usageFromInline でマークされた宣言をモジュール外のコード内で名前で参照することを許可しません。ただし、モジュール外のコードは、実行時の動作を使用して宣言のシンボルと対話できる可能性があります。
inlinable 属性でマークされた宣言は、inlinable (インライン化可能な) コードから暗黙的に使用可能です。 inlinable または usableFromInline は internal 宣言に適用できますが、両方の属性を適用するとエラーになります。
warn_unqualified_access
この属性を最上位レベルの関数、インスタンスメソッド、クラス、または静的メソッドに適用すると、その関数またはメソッドが、モジュール名、型名、インスタンス変数、または定数などを前に付けずに使用された場合に警告を発します。この属性を使用すると、同じスコープ (scope) からアクセス可能な同じ名前の関数間のあいまいさを防ぐのに役立ちます。
たとえば、Swift 標準ライブラリには、comparable (比較可能な) 要素で最上位レベルの 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
この属性は、引数なしでクロージャにその式を自動的に包み込むことにより、式の評価を遅延させるために適用されます。引数を取らず、式の型の値を返す関数型のパラメータ用に、メソッドまたは関数宣言のパラメータの型にこの属性を適用して下さい。autoclosure 属性を使用する方法の例については、オートクロージャ 及び 関数型 を参照してください。
convention
この属性を関数の型に適用して、その呼び出し規約(convention)を示します。
convention 属性は、以下の引数の1つと共に常に表示されます。
- swift 引数は、Swift 関数の参照を示します。これは Swift の関数値の標準的な呼び出し規約です。
- block 引数は、Objective-C 互換ブロックの参照を示します。関数値は、ブロックオブジェクトへの参照として表され、これは、オブジェクト内でのその呼び出し関数を埋め込む id 互換の Objective-C オブジェクトです。呼び出し関数は C の呼び出し規約を使用します。
- c 引数は、C 関数の参照を示します。関数値は文脈を持たず、C 呼び出し規約を使用します。
いくつかの例外はありますが、他の呼び出し規約が関数に必要な場合は、任意の呼び出し規約の関数を使用できます。汎用でないグローバル関数、ローカル変数をキャプチャしないローカル関数、またはローカル変数をキャプチャしないクロージャは、C 呼び出し規約に変換できます。他の Swift 関数は C 呼び出し規約に変換できません。Objective-C ブロック呼び出し規約の関数は、C 呼び出し規約に変換できません。
escaping
この属性をメソッドまたは関数宣言内のパラメータの型に適用し、後で実行するためにパラメータの値を格納できることを示します。これは、その値が呼び出しの寿命を超えて生きることを許可されていることを意味します。escaping 型の属性を持つ関数型パラメータには、プロパティまたはメソッドの self. の明示的な使用が必要です。escaping 属性の使用例については、クロージャのエスケープ を参照してください。
Switch Case 属性
switch case 属性は switch の case にのみ適用できます。
unknown
この属性を switch case に適用して、コードがコンパイルされた時点で既知の列挙型のいずれの case とも一致しないと予想されることを示します。unknown 属性の使用方法の例については、将来の列挙型 case の切り替え を参照してください。
attribute → @ attribute-name attribute-argument-clause opt
attribute-name → identifier
attribute-argument-clause → ( balanced-tokens opt )
attributes → attribute attributes opt
balanced-tokens → balanced-token balanced-tokens opt
balanced-token → ( balanced-tokens opt )
balanced-token → [ balanced-tokens opt ]
balanced-token → { balanced-tokens opt }
balanced-token → Any identifier, keyword, literal, or operator
balanced-token → Any punctuation except (, ) , [, ], {, or }
前:宣言 次:パターン
トップへ
トップへ
トップへ
トップへ