GRAMMAR OF AN EXPRESSION expression → try-operatoropt prefix-expression binary-expressionsopt expression-list → expression | expression,
expression-list
GRAMMAR OF A PREFIX EXPRESSION prefix-expression → prefix-operatoropt postfix-expression prefix-expression → in-out-expression
try
演算子の後にエラーをスローできる式が続く形で構成されます。形式は次のとおりです:try
式の値は expression の値です。try?
演算子の後にエラーをスローできる式が続く形で構成されます。形式は次のとおりです:try?
の値は式の値を含むオプショナルです。それ以外の場合、try?
の値は nil
です。try!
演算子の後にエラーをスローできる式が続く形で構成されます。形式は次のとおりです:try!
の値は experssion の値です。式がエラーをスローすると、実行時エラーが発生します。try
、try?
または try!
、がマークされている場合、その演算子はバイナリ式全体に適用されます。一方で、括弧(()
)を使用して、演算子の適用範囲を明示することもできます。try
式が括弧で囲まれていない限り、try
式はバイナリ演算子の右側には使用できません。try
と await
演算子の両方を含む場合は、最初に try
が来なければなりません。GRAMMAR OF A TRY EXPRESSION try-operator →try
|try
?
|try
!
await
演算子の後に非同期関数の結果を返す式が続けて構成されます。形式は次のとおりです:await
式の値は experssion の値です。await
でマークされた式を_潜在的中断ポイント_と呼びます。非同期関数の実行は、await
でマークされている箇所で中断することができます。また、同時並行コードの実行は他の点で中断されることはありません。つまり、潜在的中断ポイント間で、次の潜在的中断ポイントに行く前に状態の更新が完了する条件で、一時的に破壊された不変式を必要とする状態を、安全に更新することができます。await
式は、async(priority:operation:)
関数に渡される末尾クロージャのように、非同期コンテキスト内でのみ使用することができます。defer
文、または同期関数型の自動クロージャでは使用できません。await
演算子がマークされている場合、その演算子はバイナリ式全体に適用されます。ただし、括弧を使用して、演算子の適用範囲について明示することができます。await
式が括弧内に囲まれていない限り、await
式はバイナリ演算子の右側に使用できません。await
と try
演算子の両方を含む場合、最初に try
演算子が来なければなりません。GRAMMAR OF AN AWAIT EXPRESSION await-operator →await
NOTE 構文解析時には、式はバイナリ演算子のフラットなリストを構成します。このリストは、演算子の優先順位を適用することによってツリーに変換されます。例えば、式2 + 3 * 5
は、最初は5つの項目、2
、+
、3
、*
、および5
として解釈され、その後(2 + (3 * 5))
のツリーに変換します
GRAMMAR OF A INFIX EXPRESSION infix-expression → infix-operator prefix-expression infix-expression → assignment-operatoropt prefix-expression infix-expression → conditional-operatoropt prefix-expression infix-expression → type-casting-operator infix-expressions → infix-expression infix-expressionsopt
GRAMMAR OF AN asSIGNMENT OPERATOR assignment-operator →=
true
と評価された場合、条件演算子は最初の式を評価し、その値を返します。それ以外の場合は、2 番目の式を評価してその値を返します。未使用の式は評価されません。is
演算子、as
演算子、as?
演算子、そして as!
演算子。is
演算子は実行時に式が指定された型にキャストできるかどうかを確認します。キャストできる場合は true
を返します。それ以外の場合は、false
を返します。as
演算子は、コンパイル時にキャストが常に成功するとわかっている場合にキャストを実行します。アップキャストは、中間変数を使用せずに型のスーパー型のインスタンスとして式を使用できます。下記のアプローチはどれも同等です。String
などの Swift 標準ライブラリ型の式を、それに相応する NSString
などの Foudation 型で使用できるようにしています。ブリッジングの詳細については、Working with Foundation Typesを参照ください。as?
演算子は、式の指定された_型_への条件付きキャストを実行します。as?
演算子は指定された_型_のオプショナルを返します。実行時に、キャストが成功した場合、_式_の値がオプショナルで返されます。それ以外の場合、返される値は nil
です。指定された_型_へのキャストが失敗するか、成功することが明らかな場合は、コンパイルエラーが発生します。as!
演算子は、指定された型に強制キャストを実行します。as!
演算子は、オプショナル型ではなく、指定された型の値を返します。キャストが失敗した場合は、実行時エラーが発生します。x as! T
は (x as? T)!
の挙動と同じです。GRAMMAR OF A PRIMARY EXPRESSION primary-expression → identifier generic-argument-clauseopt primary-expression → literal-expression primary-expression → self-expression primary-expression → superclass-expression primary-expression → closure-expression primary-expression → parenthesized-expression primary-expression → tuple-expression primary-expression → implicit-member-expression primary-expression → wildcard-expression primary-expression → key-path-expression primary-expression → selector-expression primary-expression → key-path-string-expression
#file
String
#fileID
String
#filePath
String
#line
Int
#column
Int
#function
String
#dsohandle
UnsafeRawPointer
#file
の文字列値は、古い #filePath
から新しい #fileID
への移行を有効にするために、言語のバージョンによって異なります。現在、#file
は #filePath
と同じ値を持ちます。将来の Swift のバージョンでは、#file
は代わりに #fileID
と同じ値を持ちます。将来のバージョンの挙動を適用するには、#file
を #fileID
または #filePath
に置き換える必要があります。#fileID
式の文字列値はモジュール/ファイル形式です。ここで言う、「ファイル」は式が使用されているファイルの名前で、「モジュール」は、がこのファイルが属しているモジュールの名前です。#filePath
式の文字列値は、式が使用されているファイルへのフルパスです。Line Control Statement(行制御文)で説明されているように、これらの値はどちらも #sourceLocation
に変わる可能性があります。#fileID
は #filePath
とは異なり、ソースファイルへのフルパスをソースファイルに埋め込むことはできないため、より良いプライバシーを提供し、コンパイルされたバイナリのサイズを減させることができます。テスト、ビルドスクリプト、また配布されるプログラムの一部にはならないその他のコードの外側で #filePath
を使用しないでください。NOTE#fileID
式は、最初のスラッシュ(/
)の前のテキストをモジュール名、最後のスラッシュ(/
)の後のテキストをファイル名と読んでください。将来的には、MyModule/some/disambigation/myfile.swift
などのように、複数のスラッシュが含まれている可能性があります。
#function
の値は、関数内ではその関数の名前です。メソッド内では、そのメソッドの名前、プロパティ get または set 内ではプロパティ名、init
や subscript
のような特別なメンバ内では、そのキーワード名、およびファイルのトップレベルでは、現在のモジュール名です。,
)を続けることもできます。配列リテラルの値は [T]
型で、T
はその内部の式の型です。複数の型の式がある場合、T
はそれらに最も近い共通のスーパー型になります。空の配列リテラルは、空の角括弧([]
)を使用し、指定された型の空の配列を作成するためにも使用できます。,
)を続けることができます。辞書リテラルの値は [Key:Value]
型で、Key
はそのキー式の型、Value
はその値式の型です。複数の型の式がある場合、キーとバリューはそれぞれの値に最も近い共通のスーパー型になります。空の辞書リテラルは、空の配列リテラルと区別するために、一対の括弧内にコロンを書きます([:]
)。空の辞書リテラルを使用して、指定されたキーとバリュー型の空の辞書リテラルを作成できます。playground
リテラルには、特別なリテラル構文を使用します。GRAMMAR OF A LITERAL EXPRESSION literal-expression → literal literal-expression → array-literal | dictionary-literal | playground-literal literal-expression →#file
|#fileID
|#filePath
literal-expression →#line
|#column
|#function
|#dsohandle
array-literal →[
array-literal-itemsopt]
array-literal-items → array-literal-item,
opt | array-literal-item,
array-literal-items array-literal-item → expression dictionary-literal →[
dictionary-literal-items]
|[
:
]
dictionary-literal-items → dictionary-literal-item,
opt | dictionary-literal-item,
dictionary-literal-items dictionary-literal-item → expression:
expression playground-literal →#colorLiteral
(
red
:
expression,
green
:
expression,
blue
:
expression,
alpha
:
expression)
playground-literal →#fileLiteral
(
resourceName
:
expression)
playground-literal →#imageLiteral
(
resourceName
:
expression)
self
式は、それが使用さえている現在の型またはインスタンスへの明示的な参照です。形式は次のとおりです:self
は、それが出現する現在の型のインスタンスを表します。型メソッドでは、self
はそれが登場する現在の型を表します。self
式は、関数パラメータなどスコープ内に同じ名前の別の変数があり、何を指すのかが曖昧な場合に、メンバへアクセスするときに指定します。例えば:self
に代入できます。例えば:GRAMMAR OF A SELF EXPRESSION self-expression →self
| self-method-expression | self-subscript-expression | self-initializer-expression self-method-expression →self
.
identifier self-subscript-expression →self
[
function-call-argument-list]
self-initializer-expression →self
.
init
GRAMMAR OF A SUPERCLASS EXPRESSION superclass-expression → superclass-method-expression | superclass-subscript-expression | superclass-initializer-expression superclass-method-expression →super
.
identifier superclass-subscript-expression →super
[
function-call-argument-list]
superclass-initializer-expression →super
.
init
in
キーワードを省略してください。省略された型を推論できない場合は、コンパイルエラーが発生します$0
、$1
、 $2
などのように $
の後ろにパラメータの位置を続けた名前が与えられますmyFunction
に渡されたクロージャ式は、即時に使用される例です。その結果、クロージャ式がエスケープか非エスケープかは、式の周囲のコンテキストによって異なります。クロージャ式は、即時に呼ばれるか、非エスケープ関数の引数として渡されると、非エスケープです。それ以外の場合、クロージャ式はエスケープです。[]
)で囲まれた式のカンマ(,
)区切りのリストとして書かれます。キャプチャリストを使用する場合は、パラメータ名、パラメータ型、および戻り値の型を省略しても、in
キーワードを使用する必要があります。a
はキャプチャリストに含まれていますが、b
は含まれていません。a
という同じ名前の異なる変数がありますが、b
という名前の変数は 1 つだけです。内部スコープ内の a
は、クロージャが作成されたときに外側の a
値で初期化されますが、それらの値は繋がっていません。つまり、これは、外側の範囲内の a
の値の変化が内側の範囲内の a
の値に影響を与えず、クロージャの内側の値の変化も外側の a
に影響を与えません。対照的に、b
という名前の変数は外側の範囲内に 1 つしかなく、クロージャの内側または外側からの変化は両方に影響を与えます。x
という 2 つの変数がありますが、外部スコープの変数と内部スコープの定数は、両方とも参照セマンティクスのために同じオブジェクトを参照します。weak
または unowned
をマークすることができます。GRAMMAR OF A CLOSURE EXPRESSION closure-expression →{
closure-signatureopt statementsopt}
closure-signature → capture-listopt closure-parameter-clausethrows
opt function-resultoptin
closure-signature → capture-listin
closure-parameter-clause →(
)
|(
closure-parameter-list)
| identifier-list closure-parameter-list → closure-parameter | closure-parameter,
closure-parameter-list closure-parameter → closure-parameter-name type-annotationopt closure-parameter → closure-parameter-name type-annotation...
closure-parameter-name → identifier capture-list →[
capture-list-items]
capture-list-items → capture-list-item | capture-list-item,
capture-list-items capture-list-item → capture-specifieropt identifier capture-list-item → capture-specifieropt identifier=
expression capture-list-item → capture-specifieropt self-expression capture-specifier →weak
|unowned
|unowned(safe)
|unowned(unsafe)
x
の型はそのコンテキストから暗黙的に推論された型と正確に一致し、y
の型は Someclass
から SomeClass?
に変換され、z
の型は SomeSubclass
から SomeClass
に変換されます。(1)
はただの Int
です。:
)で区切られ、その前に識別子を指定することもできます。形式は次のとおりです:(a: 10, a: 20)
はラベル a
が同じレベルで 2 回使用されているため無効です。ただし、(a: 10, b: (a: 1, x: 2))
は有効です。a
は 2 回使用されていますが、外側のタプルに 1 回、内側のタプルに 1 回使用されています。NOTE 空のタプル式と空のタプル型はいずれもSwiftでは()
で書きます。Void
は()
のタイプエイリアスのため、空のタプル型を書くために使用できます。ただし、全てのタイプエイリアスと同様に、Void
は常に型で、空のタプル式を書くためには使用できません。GRAMMAR OF A TUPLE EXPRESSION tuple-expression →(
)
|(
tuple-element,
tuple-element-list)
tuple-element-list → tuple-element | tuple-element,
tuple-element-list tuple-element → expression | identifier:
expression
10
は x
に代入されますが、20
は無視されています:GRAMMAR OF A WILDCARD EXPRESSION wildcard-expression →_
String
、[Int]
、や Set<Int>
などのジェネリックなパラメータを含めた、具体的な型の名前です。subscript(keyPath:)
に渡します。これは全ての型で利用可能です。例えば:\ someClass.someProperty
の代わりに \.someProperty
を使用しています:(\.self)
を作成するために self
を参照できます。識別キーパスは、インスタンス全体を参照しているので、それを使用して、変数に格納されている全てのデータを単一のステップでアクセスして変更できます。例えば:\OuterStructure.outer.someValue
を使用して、OuterStructure
型の outer
プロパティの someValue
プロパティにアクセスしています:Hashable
プロトコルに準拠している限り角括弧([]
)を使用して subscript を含めることができます。この例では、key-path の subscript を使用して、配列の 2 番目の要素にアクセスしています。greetings
配列の 3 番目の要素の両方にアクセスするために、可変の index
を使用しています。index
が変更されると、key-path 式は依然として 3 番目の要素を参照する一方、クロージャは新しいインデックスを使用しています。(SomeType) -> Value
型の関数やクロージャの代わりに、基の型が SomeType
で、そのパスが Value
型の値を生成することができます。GRAMMAR OF A KEY-PATH EXPRESSION key-path-expression →\
typeopt.
key-path-components key-path-components → key-path-component | key-path-component.
key-path-components key-path-component → identifier key-path-postfixesopt | key-path-postfixes key-path-postfixes → key-path-postfix key-path-postfixesopt key-path-postfix →?
|!
|self
|[
function-call-argument-list]
Selector
型のインスタンスです。例えば:as
演算子と一緒にグループ化するための括弧を含めることができます。例えば:NOTE メソッド名とプロパティ名は式ですが、それらは決して評価されません。
GRAMMAR OF A SELECTOR EXPRESSION selector-expression →#selector
(
expression)
selector-expression →#selector
(
getter:
expression)
selector-expression →#selector
(
setter:
expression)
NOTE プロパティ名は式ですが、それらは決して評価されません。
GRAMMAR OF A POSTFIX EXPRESSION postfix-expression → primary-expression postfix-expression → postfix-expression postfix-operator postfix-expression → function-call-expression postfix-expression → initializer-expression postfix-expression → explicit-member-expression postfix-expression → postfix-self-expression postfix-expression → subscript-expression postfix-expression → forced-value-expression postfix-expression → optional-chaining-expression
:
)で区切られた引数値の前に名前を含める必要があります。この種の関数呼び出し式は形式は次のとおりです:}
)の直後にクロージャ式の形で末尾クロージャを含めることができます。末尾クロージャは、最後の括弧内の引数の後の関数型の引数と解釈されます。最初のクロージャ式に引数ラベルは付けません。次のクロージャ式の前には引数ラベルを付けます。下記の例は、末尾クロージャの構文を使用して、 末尾クロージャを使用しない関数呼び出しバージョンと同等だということを示しています:(Bool) -> Int
のようにパラメータの型が関数型@autoclosure () -> ((Bool) -> Int)
のように、ラップされた式の型が関数型の自動クロージャパラメータ((Bool) -> Int)...
のように、配列要素の型が関数型の可変長パラメータOptional<(Bool) -> Int>
のように、型がオプショナルの 1 つ以上の層にラップされているパラメータ(Optional<(Bool) -> Int>)...
のように、上記の許可された型を組み合わせたパラメータOptional
でラップされますinout SomeType
は、UnsafePointer<SomeType>
または UnsafeMutablePointer<SomeType>
になる可能性がありますinout Array<SomeType>
は、UnsafePointer<SomeType>
または UnsafeMutablePointer<SomeType>
になる可能性がありますArray<SomeType>
は、UnsafePointer<SomeType>
になる可能性がありますString
は UnsafePointer<CChar>
になる可能性がありますNOTE 配列を暗黙的に安全でないポインタに変換すると、Swift は、配列のストレージが必要に応じて配列を変換またはコピーすることによって連続していることを保証します。例えば、この構文は、そのストレージに関する API の契約がない(動作が定義されているか定かではない)NSArray
のサブクラスからArray
にブリッジされた配列でこの構文を使用できます。配列のストレージがすでに連続していることを保証する必要がある場合、暗黙の変換を行わないようにするために、Array
の代わりにContigureArray
を使用します
withUnsafePointer(to:)
のような明示的な機能の代わりに、&
を使うことで、低レベルの C 言語の関数を呼び出しやすくするのに役立ちます。ただし、他の Swift コードから関数を呼び出すときは、安全でない API を明示的に使用する代わりとして &
を使用しないでください。GRAMMAR OF A FUNCTION CALL EXPRESSION function-call-expression → postfix-expression function-call-argument-clause function-call-expression → postfix-expression function-call-argument-clauseopt