do
文、および現在のスコープが終了する直前のクリーンアップアクションを実行するための defer
文を提供します。;
)は任意の文の後に書くことができ、同じ行に複数の文が書かれている場合に、それらを分離するために使用されます。GRAMMAR OF A STATEMENT statement → expression;
opt statement → declaration;
opt statement → loop-statement;
opt statement → branch-statement;
opt statement → labeled-statement;
opt statement → control-transfer-statement;
opt statement → defer-statement;
opt statement → do-statement;
opt statement → compiler-control-statement statements → statement statementsopt
for-in
文、while
文、および repeat-while
文です。break
文と continue
文によって変更でき、下記のBreak Statement(Break 文)とContinue Statement(Continue 文)で説明します。GRAMMAR OF A LOOP STATEMENT loop-statement → for-in-statement loop-statement → while-statement loop-statement → repeat-while-statement
for-in
文の形式は次のとおりです:makeIterator()
メソッドは、IteratorProtocolプロトコルに準拠した型のイテレータ型の値を取得するために、collection 式で呼び出されます。プログラムは、イテレータ上で next()
メソッドを呼び出すことによってループの実行を開始します。返された値が nil
ではない場合、item に代入され、プログラムは statements を実行し、再びループの先頭から実行を続行します。それ以外の場合、プログラムは値の代入や、statements を実行せず、for-in
文の実行は終了します。GRAMMAR OF A FOR-IN STATEMENT for-in-statement →for
case
opt patternin
expression where-clauseopt code-block
while
文は、条件が true な限り、コードブロックを繰り返し実行できます。while
文の形式は次のとおりです:while
文は次のように実行されます。true
の場合、実行はステップ 2 に続きます。false
の場合、プログラムは while
文の実行を終了しますwhile
文内の statements は 0 回以上実行されます。Bool
型または Bool
にブリッジされた型でなければなりません。Optional Binding(オプショナルバインディング)で説明したように、条件はオプショナルバインディング宣言にすることもできます。GRAMMAR OF A WHILE STATEMENT while-statement →while
condition-list code-block condition-list → condition | condition,
condition-list condition → expression | availability-condition | case-condition | optional-binding-condition case-condition →case
pattern initializer optional-binding-condition →let
pattern initializer |var
pattern initializer
repeat-while
文は、条件が true な限り、コードブロックを 1 回以上実行できます。repeat-while
文の形式は次のとおりです:repeat-while
文は次のように実行されます。true
の場合、実行はステップ 1 に戻ります。false
の場合、プログラムは repeat-while
文の実行を終了しますrepeat-while
文内の文は少なくとも 1 回実行されます。Bool
型または Bool
にブリッジされた型にする必要があります。Optional Binding(オプショナルバインディング)で説明したように、条件はオプショナルバインディング宣言にすることもできます。if
文、guard
文、および switch
文の 3 つの分岐文があります。GRAMMAR OF A BRANCH STATEMENT branch-statement → if-statement branch-statement → guard-statement branch-statement → switch-statement
if
文は、1 つ以上の条件の評価に基づいてコードを実行するために使用されます。if
文には 2 つの基本的な形式があります。それぞれの形式で、開閉中括弧({}
)が必要です。if
文の 2 番目の形式は、追加の(else
キーワードによって導入される)_else 句を_提供し、条件が true の場合にコードの一部を実行し、false の場合にコードの別の部分を実行するために使用されます。else 句が 1 つ存在する場合、if
文の形式は次のとおりです:if
文の else 句には、複数の条件を検証するための別の if
文を含めることができます。このようにチェーンした if
文の形式は次のとおりです:if
文の条件の値は、Bool
型または Bool
にブリッジされた型にする必要があります。Optional Binding(オプショナルバインディング)で説明したように、条件はオプショナルバインディング宣言にすることもできます。GRAMMAR OF AN IF STATEMENT if-statement →if
condition-list code-block else-clauseopt else-clause →else
code-block |else
if-statement
guard
文は、1 つ以上の条件が満たされない場合に、プログラム制御をスコープ外に転送するために使用されます。guard
文の形式は次のとおりです:guard
文の条件の値は、Bool
型または Bool
にブリッジされた型にする必要があります。Optional Binding(オプショナルバインディング)で説明したように、条件はオプショナルバインディング宣言にすることもできます。guard
文条件のオプショナルバインディング宣言から定数または変数へ値を代入することができ、guard
文を囲んでいるスコープの後の部分で使用できます。guard
文の else
句は必須で、次の文のいずれかを使用して、Never
型の戻り値を持つ関数を呼び出すか、guard
文を呼び出したスコープ外にプログラム制御を転送する必要があります。return
break
continue
throw
Never
型の戻り値を持つ関数の詳細については、Functions that Never Return(ノーリターン関数)を参照ください。switch
文を使用すると、制御式の値に応じて特定のコードブロックを実行できます。switch
文の形式は次のとおりです。switch
文の control expression が評価され、それぞれの場合に指定されたパターンと比較されます。一致するものが見つかった場合、プログラムはそのケースの範囲内の statements を実行します。各ケースのスコープを空にすることはできません。そのため、各ケースラベルのコロン(:
)の後に少なくとも 1 つの文を含める必要があります。コードを実行する予定がない場合は、単一の break
文を使用します。switch
文でこれらの様々な種類の値を使用する方法の例については、Control Flow(制御フロー)のSwitchを参照ください。switch
のケースには、各パターンの後に where
句を含めることができます。_where 句_は、where
キーワードの後に式が続くことで導入され、ケースのパターンが control expression に一致すると見なされる前に追加の条件を提供するために使用されます。where
句が存在する場合、関連するケース内の statements は、control expression の値がケースのパターンの 1 つと一致し、where
句の式が true
と評価された場合にのみ実行されます。例えば、control expression は、(1、1)
など、同じ値の 2 つの要素を含むタプルの場合にのみ、下記の例のケースに一致します。let
キーワードを使用して定数にバインドすることもできます(var
キーワードを使用して変数にバインドすることもできます)。これらの定数(または変数)は、対応する where
句、およびケースのスコープ内で参照できます。control expression に複数のケース含まれている場合、全てのパターンで同じ定数または変数にバインドされ、バインドされた各変数または定数は同じ型でなければなりません。switch
文には、default
キーワードによって導入されたデフォルトのケースを含めることもできます。デフォルトのケース内のコードは、他のケースが制御式に一致しない場合にのみ実行されます。switch
文には、デフォルトのケースを 1 つだけ含めることができます。これは、switch
文の最後に書く必要があります。switch
文でのパターンマッチングは、評価がソースの順序、つまり、コードに現れる順序で評価されているかのように動作します。その結果、複数のケースに同じ値と評価されるパターンが含まれていて、制御式の値と一致する可能性がある場合、プログラムは最初に一致したケース内のコードのみを実行します。Int
の場合)、要件を満たすためにデフォルトのケースを含めることができます。switch
ケースがすでにある場合でも、常にデフォルトのケースを含める必要があります。@unknown
属性をデフォルトのケースに適用できます。これは、デフォルトのケースが、将来追加される列挙ケースでのみ一致するべきだということを示します。デフォルトのケースがコンパイラ時に既知の列挙ケースと一致する場合、Swift は警告を生成します。この将来のケースへの警告は、ライブラリの作成者が、新しいケースを列挙型に追加したことを知らせてくれます。switch
文を更新する必要があることを示す警告を生成します。switch
文を終了します。プログラムの実行は次のケースまたはデフォルトのケースに続行または「通り抜け」ません。あるケースから次のケースまで実行を継続したい場合、fallthrough
キーワードで構成される fallthrough
文を明示的に含めます。fallthrough
文の詳細については、下記のFallthrough Statement(Fallthrough 文)を参照ください。GRAMMAR OF A SWITCH STATEMENT switch-statement →switch
expression{
switch-casesopt}
switch-cases → switch-case switch-casesopt switch-case → case-label statements switch-case → default-label statements switch-case → conditional-switch-case case-label → attributesoptcase
case-item-list:
case-item-list → pattern where-clauseopt | pattern where-clauseopt,
case-item-list default-label → attributesoptdefault
:
where-clause →where
where-expression where-expression → expression conditional-switch-case → switch-if-directive-clause switch-elseif-directive-clausesopt switch-else-directive-clauseopt endif-directive switch-if-directive-clause → if-directive compilation-condition switch-casesopt switch-elseif-directive-clauses → elseif-directive-clause switch-elseif-directive-clausesopt switch-elseif-directive-clause → elseif-directive compilation-condition switch-casesopt switch-else-directive-clause → else-directive switch-casesopt
GRAMMAR OF A LABELED STATEMENT labeled-statement → statement-label loop-statement labeled-statement → statement-label if-statement labeled-statement → statement-label switch-statement labeled-statement → statement-label do-statement statement-label → label-name:
label-name → identifier
break
文、continue
文、fallthrough
文、return
文、および throw
文の 5 つの制御転送文があります。GRAMMAR OF A CONTROL TRANSFER STATEMENT control-transfer-statement → break-statement control-transfer-statement → continue-statement control-transfer-statement → fallthrough-statement control-transfer-statement → return-statement control-transfer-statement → throw-statement
break
文は、ループ、if
文、または switch
文のプログラムの実行を終了します。下記に示すように、break
文は、break
キーワードのみで構成することも、break
キーワードの後に文ラベルを続けることもできます。break
文の後に文ラベルが続く場合、そのラベルで指定されたループ、if
文、または switch
文のプログラム実行を終了します。break
文の後に文ラベルが続かない場合は、switch
文またはそれが登場する最も内側のループ文のプログラムの実行を終了します。ラベルのない break
文を使用して if
文から抜け出すことはできません。switch
文(存在する場合)で囲まれているコードの次の行に移ります。continue
文は、ループ文の現在のイテレーションを終了しますが、ループ文の実行を停止しません。次に示すように、continue
文は continue
キーワードのみで構成することも、continue
キーワードとそれに続く文ラベルで構成することもできます。continue
文の後に文ラベルが続く場合、そのラベルで指定されたループの現在のイテレーションを終了します。continue
文の後に文ラベルが続かない場合、それが登場する最も内側のループの現在のイテレーションを終了します。for
文では、increment 式はループの本文の実行後に評価されるため、continue
文の実行後も increment 式は評価されます。fallthrough
文は fallthrough
キーワードで構成され、switch
文のケースブロックでのみ発生します。fallthrough
文により、プログラムの実行は、switch
文の 1 つのケースから次のケースに続行します。ケースラベルのパターンが switch
文の制御式の値と一致しない場合でも、プログラムの実行は次のケースに進みます。fallthrough
文は、ケースブロックの最後の文としてだけでなく、switch
文内のどこにでも表示できますが、最後のケースブロックでは使用できません。また、パターンに値バインディングのパターンが含まれているケースのブロックに制御を移すこともできません。switch
文で fallthrough
文を使用する方法の例については、Control Flow(制御フロー)のControl Transfer Statements(制御転送文)を参照ください。GRAMMAR OF A FALLTHROUGH STATEMENT fallthrough-statement →fallthrough
return
文は、関数またはメソッド定義の本文で登場し、プログラムの実行を呼び出し元の関数またはメソッドに戻します。プログラムの実行は、関数またはメソッドの呼び出しの直後から続行されます。return
文は return
キーワードのみで構成することも、return
キーワードとそれに続く式で構成することもできます。return
文の後に式が続く場合、式の値は呼び出し元の関数またはメソッドに返されます。式の値が関数またはメソッドで宣言された戻り値の型と一致しない場合、式の値は、呼び出し元の関数またはメソッドに返される前に戻り値の型に変換されます。NOTE Failable Initializers(失敗可能イニシャライザ)で説明されているように、失敗可能なニシャライザで特別な形式のreturn
文(return nil
)を使用して、イニシャライザの失敗を示すことができます。
return
文の後に式がない場合は、値を返さない関数またはメソッド(つまり、関数またはメソッドの戻り値の型が Void
または ()
の場合)のみで使用できますthrow
文は、エラーをスローする関数またはメソッドの本文、または型が throws
キーワードでマークされているクロージャ式の本文で使用できます。throw
文により、プログラムは現在のスコープの実行を終了し、それを囲むスコープへエラーを伝播します。スローされたエラーは、do
文の catch
句によって処理されるまで伝播し続けます。throw
文は、throw
キーワードとそれに続く式で構成されます。Error
プロトコルに準拠する型でなければなりません。throw
文の使用方法の例については、Error Handling(エラーハンドリング)のPropagating Errors Using Throwing Functions(スロー関数を使用したエラーの伝播)を参照ください。defer
文は、defer
文が使用されるスコープ外にプログラム制御を転送する直前にコードを実行するために使用されます。defer
文の形式は次のとおりです:defer
文内の文は、プログラム制御がどのように転送されても実行されます。つまり、defer
文を使用して、例えば、ファイル記述子を閉じるなどの手動のリソース管理や、エラーがスローされた場合でも実行する必要のあるアクションを実行できます。defer
文が同じスコープに表示される場合、それらが登場する順序は、実行される順序の逆になります。特定のスコープで最後の defer
文を最初に実行するということは、その最後の defer
文内の文が、他の defer
文によってクリーンアップされるリソースを参照できることを意味します。defer
文内の文は、プログラム制御を defer
文の外部に移すことはできません。do
文は、新しいスコープを導入するために使用され、1 つ以上の catch
句を含めることができます。これには、定義されたエラー条件に一致するパターンが含まれます。do
文のスコープで宣言された変数と定数は、そのスコープ内でのみアクセスできます。do
文は、コードブロックを区切るために使用される C 言語の大括弧({}
)に似ており、実行時にパフォーマンスコストが発生しません。do
文の形式は次のとおりです:do
ブロック内のいずれかの文がエラーをスローした場合、プログラム制御は、パターンがエラーに一致する最初の catch
句に移ります。どの句も一致しない場合、エラーは周囲のスコープに伝播します。エラーがトップレベルでも処理されない場合、プログラムの実行は実行時エラーで停止します。switch
文と同様に、コンパイラは catch
句が全てのエラーを網羅しているかどうかを調べます。網羅されている場合、エラーは処理されたと見なされます。そうしないと、エラーがスコープ外に伝播する可能性があります。つまり、エラーは catch
句内で処理するか、関数を throws
で宣言する必要があります。catch
句は、そのパターンのいずれかにエラーが一致する場合、エラーに一致すると見なされます。catch
句に複数のパターンが含まれている場合、全てのパターンで同じ定数または変数にバインドされる必要があり、バインドされた各変数または定数は、catch
句の全てのパターンで同じ型でなければなりません。_
)など、全てのエラーに一致するパターンで catch
句を使用します。catch
句でパターンが指定されていない場合、catch
句は全てのエラーと一致し、error
という名前のローカル定数にバインドします。catch
句で使用できるパターンの詳細については、Patterns(パターン)を参照ください。GRAMMAR OF A DO STATEMENT do-statement →do
code-block catch-clausesopt catch-clauses → catch-clause catch-clausesopt catch-clause →catch
catch-pattern-listopt code-block catch-pattern-list → catch-pattern | catch-pattern,
catch-pattern-list catch-pattern → pattern where-clauseopt
GRAMMAR OF A COMPILER CONTROL STATEMENT compiler-control-statement → conditional-compilation-block compiler-control-statement → line-control-statement compiler-control-statement → diagnostic-statement
#if
コンパイルディレクティブで始まり、#endif
コンパイルディレクティブで終わります。単純な条件付きコンパイルブロックの形式は次のとおりです。if
文の条件とは異なり、_コンパイル条件_はコンパイル時に評価されます。その結果、statements は、コンパイル時にコンパイル条件が true
と評価された場合にのみ、コンパイルおよび実行されます。true
および false
のブールリテラル、-D
コマンドラインフラグで使用される識別子、または下記の表にリストされているプラットフォーム条件のいずれかを含めることができます。os()
macOS
, iOS
, watchOS
, tvOS
, Linux
, Windows
arch()
i386
, x86_64
, arm
, arm64
swift()
>=
または <
の後ろにバージョン番号compiler()
>=
または <
の後ろにバージョン番号canImport()
targetEnvironment()
simulator
, macCatalyst
swift()
および compiler()
プラットフォーム条件のバージョン番号は、メジャー番号、任意のマイナー番号、任意のパッチ番号で構成され、バージョン番号の各部分をドット(.
)で区切ります。比較演算子とバージョン番号の間にスペースを入れてはいけません。コンパイラに渡される Swift バージョンの設定に関係なく、compiler()
のバージョンはコンパイラのバージョンです。swift()
のバージョンは、現在コンパイルされている言語バージョンです。例えば、Swift4.2 モードで Swift5 のコンパイラを使用してコードをコンパイルする場合、コンパイラのバージョンは 5
で、言語のバージョンは 4.2
です。これらの設定では、次のコードは 3 つのメッセージ全てを出力します:canImport()
プラットフォーム条件の引数は、全てのプラットフォームに存在するとは限らないモジュールの名前です。この条件は、モジュールをインポートできるかどうかをテストしますが、実際にはインポートしません。モジュールが存在する場合、プラットフォーム条件は true
を返します。それ以外の場合は、false
を返します。targetEnvironment()
プラットフォーム条件は、指定された環境用にコードがコンパイルされているときに true
を返します。それ以外の場合は、false を返します。NOTEarch(arm)
プラットフォーム条件は、ARM64 デバイスではtrue
を返しません。コードが 32 ビット iOS シミュレーター用にコンパイルされると、arch(i386)
プラットフォーム条件はtrue
を返します。
&&
、||
、および !
を使用して、コンパイル条件を組み合わせたり、無効にしたり、グループ化に括弧を使用できます。これらの演算子は、通常のブール式を組み合わせるために使用される論理演算子と同じ結合規則と優先順位を持っています。if
文と同様に、複数の条件分岐を追加して、様々なコンパイル条件を検証できます。#elseif
句を使用して、分岐をいくつでも追加できます。#else
句を使用して、最後の分岐を追加することもできます。複数のブランチを含む条件付きコンパイルブロックの形式は次のとおりです:NOTE 条件付きコンパイルブロックの本文にある各文は、コンパイルされない場合でも解析されます。ただし、コンパイル条件にswift()
またはcompiler()
プラットフォーム条件が含まれている場合は例外です。言語またはコンパイラのバージョンがプラットフォーム条件で指定されているものと一致する場合にのみ解析されます。この例外により、古いコンパイラが新しいバージョンの Swift で導入された構文を解析しないことが保証されます。
GRAMMAR OF A CONDITIONAL COMPILATION BLOCK conditional-compilation-block → if-directive-clause elseif-directive-clausesopt else-directive-clauseopt endif-directive if-directive-clause → if-directive compilation-condition statementsopt elseif-directive-clauses → elseif-directive-clause elseif-directive-clausesopt elseif-directive-clause → elseif-directive compilation-condition statementsopt else-directive-clause → else-directive statementsopt if-directive →#if
elseif-directive →#elseif
else-directive →#else
endif-directive →#endif
compilation-condition → platform-condition compilation-condition → identifier compilation-condition → boolean-literal compilation-condition →(
compilation-condition)
compilation-condition →!
compilation-condition compilation-condition → compilation-condition&&
compilation-condition compilation-condition → compilation-condition||
compilation-condition platform-condition →os
(
operating-system)
platform-condition →arch
(
architecture)
platform-condition →swift
(
>=
swift-version)
|swift
(
<
swift-version)
platform-condition →compiler
(
>=
swift-version)
|compiler
(
<
swift-version)
platform-condition →canImport
(
module-name)
platform-condition →targetEnvironment
(
environment)
operating-system →macOS
|iOS
|watchOS
|tvOS
|Linux
|Windows
architecture →i386
|x86_64
|arm
|arm64
swift-version → decimal-digits swift-version-continuationopt swift-version-continuation →.
decimal-digits swift-version-continuationopt module-name → identifier environment →simulator
|macCatalyst
#line
、#file
、#fileID
、および #filePath
リテラル式の値を変更します。line number は #line
の値を変更し、0 より大きい任意の整数リテラルです。file path は、#file
、#fileID
、および #filePath
の値を変更する文字列リテラルです。指定された文字列が #filePath
の値になり、文字列の最後のパスコンポーネントが #fileID
の値として使用されます。#file
、#fileID
、および #filePath
については、Literal Expression(リテラル式)を参照ください。#sourceLocation()
は、ソースコードの場所をデフォルトの行番号とファイルパスにリセットします。GRAMMAR OF A LINE CONTROL STATEMENT line-control-statement →#sourceLocation
(
file:
file-path,
line:
line-number)
line-control-statement →#sourceLocation
(
)
line-number → 0 以上の 10進整数 file-path → static-string-literal
GRAMMAR OF A COMPILE-TIME DIAGNOSTIC STATEMENT diagnostic-statement →#error
(
diagnostic-message)
diagnostic-statement →#warning
(
diagnostic-message)
diagnostic-message → static-string-literal
if
、while
、および guard
文の条件として使用され、指定されたプラットフォームの引数に基づいて、実行時に API が使用可能かどうかを検証します。iOS
、macOS
、watchOS
、tvOS
を使用し、対応するバージョン番号を含めます。*
引数は必須で、他のプラットフォームでは、availability 条件によって保護されたコードブロックの本文が、ターゲットで指定された最小のデプロイターゲットで実行されることを指定します。&&
や ||
などの論理演算子を使用して availability 条件を組み合わせることはできません。GRAMMAR OF AN AVAILABILITY CONDITION availability-condition →#available
(
availability-arguments)
availability-arguments → availability-argument | availability-argument,
availability-arguments availability-argument → platform-name platform-version availability-argument →*
platform-name →iOS
|iOSApplicationExtension
platform-name →macOS
|macOSApplicationExtension
platform-name →macCatalyst
|macCatalystApplicationExtension
platform-name →watchOS
platform-name →tvOS
platform-version → decimal-digits platform-version → decimal-digits.
decimal-digits platform-version → decimal-digits.
decimal-digits.
decimal-digits