Swift 6.0 beta 日本語化計画 : Swift 6.0 beta
語彙の構造
Swift の 語彙の構造 は、一連の文字が形作る言語の有効なトークンを説明します。これらの有効なトークンは、言語の最下位レベルをビルドするブロックを形成し、後に続く章で残りの言語の部分を記述するために使用されます。トークンは、識別子、キーワード、句読点、リテラル、または演算子で構成されます。
ほとんどの場合、トークンは以下に指定された文法の制約内で、入力テキストからできるだけ長い部分文字列を考慮して Swift のソースファイルの文字から生成されます。この動作は、最長一致 または 最大かじりつき (maximal munch) と呼ばれています。
空白には2つの用途があります:ソースファイルでトークンを分ける用途と、演算子が接頭辞、接尾辞または挿入辞 (演算子 を参照) かを決定するのに役立ちますが、それ以外は無視されます。以下の文字は空白と見なされます:スペース (U+0020)、ラインフィード(U+000A)、キャリッジリターン (U+000D)、水平タブ (U+0009)、垂直タブ (U+000B)、フォームフィード (U+000C)、そしてヌル (U+0000)。
コメントは、コンパイラによって、空白として扱われます。一行のコメントは、// で始まり、ラインフィード (U+000A) またはキャリッジリターン (U+000D) まで続きます。複数行のコメントは、/* で始まり、*/ で終わります。複数の行のコメントを入れ子にすることは許可されていますが、コメントのマーカーは、バランスをとらなければなりません。
マークアップの書式リファレンス で説明したように、コメントは追加の書式やマークアップを含むことができます。
識別子 は、A から Z の大文字または小文字か、アンダースコア (_) で始まる、基本多言語面での、非結合英数字の Unicode 文字、または私用領域にない基本多言語面外の文字で始まります。最初の文字の後は、数字と結合 Unicode 文字を結合するのもまた許可されています。
アンダースコアで始まる識別子、最初の引数ラベルがアンダースコアで始まるサブスクリプト、および最初の引数ラベルがアンダースコアで始まるイニシャライザは、それらの宣言に public アクセス レベル修飾子が含まれている場合でも、internal として扱います。この規則により、フレームワークの作成者は、クライアントが操作したり依存したりしてはならない API の部分にマークを付けることができますが、一部の制限では宣言を public に (公開) する必要があります。さらに、2 つのアンダースコアで始まる識別子は、Swift コンパイラと標準ライブラリ用に予約されています。
識別子として予約語を使用するには、前と後にバッククォート(`) を置きます。例えば、class は有効な識別子ではありませんが、`class` は有効です。バッククォートは、識別子の一部とは見なされず、`x` および x は同じ意味を持ちます。
明示的でないパラメータ名を持つクロージャの内部では、パラメータは暗黙のうちに $0,$1,$2, などなどという名前が付けられます。これらの名前は、クロージャの範囲内で有効な識別子です。
コンパイラは、プロパティラッパープロジェクションを持つプロパティのドル記号 ($) で始まる識別子を合成します。あなたのコードはこれらの識別子とやり取りできますが、その接頭辞を持つ識別子を宣言することはできません。詳細については、属性 の章の propertyWrapper セクションを参照してください。
以下のキーワードは予約されており、それらはバッククォートでエスケープしている場合を除き、上の 識別子 に述べたように、識別子としては使用できません。inout, var, 及び let 以外のキーワードは、バッククォートでエスケープすることなく関数宣言や関数呼び出しのパラメータ名として使用できます。メンバがキーワードと同じ名前を持つ場合、そのメンバへの参照は、メンバへの参照とキーワードの使用の間に曖昧さがある場合を除いて、バッククォートでエスケープする必要はなく、例えば self, Type および Protocol が明示的なメンバ式に特殊な意味を持っている場合、それらはその文脈内ではバッククォートでエスケープしなければなりません。
以下のトークンは、句読点として予約されており、カスタム演算子として使用できません。(, ), {, }, [, ], ., ,, :, ;, =, @, #, &(接頭辞演算子として)、->, `, ?, そして ! (接尾辞演算子として)。
リテラル は、数値や文字列などの型の値をソースコードで表現したものです。
リテラルの例を以下に示します。
リテラルには、それ独自の型はありません。その代わりに、リテラルは無限の精度を記述し、Swift の型推論はリテラルの型を推測しようとします。たとえば、let x: Int8 = 42 の宣言では、Swift は整数リテラル 42 の型は Int8 であることを推測するのに (:Int8) の明示的な型注釈を使用しています。利用可能な適切な型の情報がない場合には、Swift は、リテラルの型は Swift 標準ライブラリで定義されたデフォルトのリテラル型の一つであることを推測し、下の表にリストしました。リテラル値の型注釈を指定する場合、注釈の型は、そのリテラル値からインスタンス化できる型でなければなりません。つまり、型は、以下の表にリストされている Swift 標準ライブラリプロトコルに準拠しなければなりません。
リテラル | デフォルト型 | プロトコル |
整数 | Int | ExpressibleByIntegerLiteral |
浮動小数点 | Double | ExpressibleByFloatLiteral |
文字列 | String | ExpressibleByStringLiteral、単一の Unicode スカラーのみを含む文字列リテラルの場合は ExpressibleByUnicodeScalarLiteral、単一の拡張書記素クラスタのみを含む文字列リテラルの場合は ExpressibleByExtendedGraphemeClusterLiteral |
正規表現 | Regex | なし |
ブール値 | Bool | ExpressibleByBooleanLiteral |
たとえば、宣言 let str = "Hello, world" では、文字列リテラル "Hello, world" のデフォルトの推測型は String です。また、Int8 は ExpressibleByIntegerLiteral プロトコルに準拠しているため、宣言 let x: Int8 = 42 の整数リテラル 42 の型注釈で使用できます。
整数リテラル は、不特定の精度の整数値を表します。デフォルトでは、整数リテラルは十進で表現されます。接頭辞を使用して別の基数を指定できます。二進数のリテラルは 0b で始まり、八進リテラルは 0o で始まり、十六進リテラルは 0x で始まります。
十進リテラルは 0 から9 の数字を含みます。二進リテラルは、0 と 1 の数字を含み、八進リテラルは 0 から 7 を含み、十六進リテラルは 0 から 9 までと、同様に大文字または小文字の A から F を含みます。
負の整数リテラルは、-42 のように、整数リテラルにマイナス記号 (-) を付けて表されます。
アンダースコア (_)は、読みやすさのため数字の間に置くことを認められていますが、無視され、そのためリテラルの値に影響を与えません。整数リテラルは先頭をゼロ (0) で始めることができますが、それらは同様に無視され、リテラルの基数や値には影響しません。
特に指定しない限り、整数リテラルのデフォルトの推論された型は、Swift 標準ライブラリの型 Int です。整数 で説明したように、Swift 標準ライブラリも、符号付きと符号なし整数の様々なサイズの型を定義しています。
浮動小数点リテラル は、不特定の精度の浮動小数点値を表します。
デフォルトでは、浮動小数点リテラルは (接頭辞なしで) 十進数で表されますが、また(0x の接頭辞で) 十六進数で表すこともできます。
十進浮動小数点リテラルは、十進数の桁から成り、小数、十進の指数のいずれか、あるいはその両方が続くシークエンスで構成されています。十進の小数は、小数点 (.) に十進数が続くシーケンスで構成されています。指数は、大文字または小文字の e の接頭辞と、それに続く e に先行する値に 10 の累乗が乗算されることを示す 10 進数のシーケンスで構成されます。たとえば、1.25e2 は 1.25×102 を表し、125.0 と等しくなります。同様に、1.25e-2 は 1.25×10-2 を表し、0.0125 に等しくなります。
十六進浮動小数点リテラルは、0x の接頭辞に続いて、オプションで十六進数の小数が続き、十六進数の指数が続いて構成されています。十六進の小数は、小数点とそれに続く十六進数のシーケンスで構成されています。指数部は大文字または小文字の p 接頭辞と、それに続く、2 の何乗かを示す値の十進数のシークエンスが続きます。たとえば、0xFp2 は 15×22 を表し、これは 60 と等しく、同様に 0xFp-2 は 15×2-2 を表し、3.75 と等しくなります。
負の浮動小数点リテラルは、-42.5 のように、浮動小数点リテラルにマイナス符号 (-)を前に付けることによって表されます。
アンダースコア(_) は、読みやすくするために数字の間に置く事を許可されていますが、無視され、リテラルの値に影響を与えません。浮動小数点リテラルは、先頭をゼロ(0) で始めることができますが、同様に無視され、リテラルの基数または値には影響しません。
特に指定しない限り、浮動小数点リテラルのデフォルトの推論された型は、64 ビットの浮動小数点数を表す、 Double の Swift 標準ライブラリの型です。Swift の標準ライブラリはまた、32 ビット浮動小数点数を表す Float 型も定義しています。
文字列リテラルは、引用符で囲まれた一連の文字です。単一の行の文字列リテラルは二重引用符で囲まれ、以下の形式をとります。
"<#characters#>"
文字列のリテラルは、エスケープされていない二重引用符 (")、エスケープされていないバックスラッシュ (\)、キャリッジリターン、またはラインフィードをを含めることはできません。
複数行の文字列リテラルは、3つの二重引用符で囲まれ、以下の形式です。
"""
<#characters#>
"""
単一行の文字列リテラルとは異なり、複数行の文字列リテラルには、エスケープされていない二重引用符 (")、キャリッジリターン、ラインフィードを含めることができます。3つのエスケープされていない二重引用符を互いに隣接して含むことはできません。
複数行の文字列リテラルを開始する """ の後の改行は文字列の一部ではありません。リテラルを終了する """ の前の改行もまた文字列の一部ではありません。ラインフィードで始まるか終わる複数行の文字列リテラルを作成するには、最初または最後の行に空の行を記述します。
複数行の文字列リテラルは、空白とタブの任意の組み合わせを使用してインデントすることができます。このインデントは文字列には含まれません。リテラルを終了する """ が、インデントを決定します。リテラル内の空白でない行はすべて、終了する """ の前に表示されるインデントとまったく同じインデントで始まらなければなりません。タブとスペースの間を変えてはいけません。そのインデントの後にスペースとタブを追加することはできます。それらのスペースとタブが文字列に表示されます。
複数行文字列リテラル内の改行は、ラインフィードの文字を使用するために正規化されます。ソースファイルにキャリッジリターンとラインフィードが混在していても、文字列内の改行はすべて同じになります。
複数行の文字列リテラルでは、行の最後にバックスラッシュ (\) を書くと、その文字列から改行が省略されます。バックスラッシュと改行の間の空白も省略されます。この構文を使用して、結果の文字列の値を変更することなく、ソースコード内で複数行の文字列リテラルをハードラップ (hard wrap) することができます。
以下のエスケープシーケンスを使用して、単一行と複数行形式の両方の文字列リテラルに特殊文字を含めることができます。
式の値は、バックスラッシュ (\) の後の括弧内に式を配置することによって文字列リテラル内に挿入できます。補間された式は、文字列リテラルを含められますが、エスケープされていないバックスラッシュ、キャリッジリターン、またはラインフィードをを含めることはできません。
たとえば、以下のすべての文字列リテラルは同じ値を持っています:
拡張区切り文字で区切られた文字列は、引用符と 1 つ以上のシャープ記号 (#) のバランスの取れたセットで囲まれた一連の文字です。拡張区切り文字で区切られた文字列の形式は以下のとおりです。
拡張区切り文字で区切られた文字列内の特殊文字は、特殊文字としてではなく通常の文字として結果の文字列に表示されます。拡張区切り文字を使用して、通常は文字列補間の生成や、エスケープシーケンスの開始や、文字列の終了などの特殊効果を持つ文字を含む文字列を作成できます。
以下の例は、文字列リテラルと、同等の文字列値を作成する拡張区切り文字で区切られた文字列を示しています。
一つ以上のシャープ記号 (#) を使用して拡張区切り文字で区切られた文字列を形成する場合、シャープ記号同士の間に空白を入れないでください。
拡張区切り文字を使用して作成する複数行文字列リテラルには、通常の複数行文字列リテラルと同じインデント要件があります。
文字列リテラルのデフォルトの推論された型は String です。String 型の詳細については、文字列と文字 と、 String を参照してください。
+ 演算子で連結された文字列リテラルは、コンパイル時に連結されます。たとえば、以下の例の textA と textB の値は、同一です。実行時の連結は行なわれません。
正規表現リテラルは、以下の形式のスラッシュ (/) で囲まれた一連の文字です。
正規表現リテラルは、エスケープされていないタブまたはスペースで始まってはならず、エスケープされていないスラッシュ (/)、キャリッジ リターン、またはライン フィードを含めることはできません。
正規表現リテラル内では、バックスラッシュは、文字列リテラルのようなエスケープ文字としてではなく、その正規表現の一部として理解されます。これは、以下の特殊文字を文字どおりに解釈すべきこと、または以下の非特殊文字を特別な方法で解釈すべきことを示します。たとえば、/\(/ は単一の左括弧に一致し、/\d/ は 1 つの数字に一致します。
拡張区切り文字で区切られた正規表現リテラルは、スラッシュ (/) と、バランスされた 1 つ以上のシャープ記号 (#) で囲まれた一連の文字です。拡張区切り文字で区切られた正規表現リテラルの形式は以下のとおりです。
拡張区切り文字を使用する正規表現リテラルは、エスケープされていないスペースまたはタブで始まり、エスケープされていないスラッシュ (/) を含み、複数行にまたがることができます。複数行の正規表現リテラルの場合、開始区切り文字は行の末尾にあり、終了区切り文字は独自の行になければなりません。複数行の正規表現リテラル内では、拡張正規表現構文がデフォルトで有効になっています。具体的には、空白は無視され、コメントが許可されます。
一つ以上のシャープ記号を使用して拡張区切り文字で区切られた正規表現リテラルを形成する場合は、シャープ記号の間に空白を入れないでください。
空の正規表現リテラルを作成する必要がある場合は、拡張区切り文字構文を使用しなければなりません。
Swift の標準ライブラリでは、使えるように数多くの演算子を定義しており、その多くは 基本演算子 および 高度な演算子 で議論されています。本セクションでは、どの文字がカスタムの演算子を定義するために使用できるか説明します。
カスタム演算子は、/, =, -, +, !, *, %, <, >, &, |, ^, ?, または ~ 、の ASCII 文字の内の一つで始まるか、または以下の文法で定義されている Unicode 文字の一つで始まります(これは、算術演算子、その他の記号、および Dingbats Unicode ブロック、その他からの文字を含みます)。最初の文字の後には、Unicode 文字を組み合わせたものも許可されます。
また、ドット(.) で始まるカスタム演算子を定義することもできます。これらの演算子は、追加のドットを含めることができます。たとえば、.+. は単一の演算子として扱われます。演算子が、ドットで始まらない場合、他の場所にドットを含めることはできません。例えば、+.+ は、.+ 演算子が続く + 演算子として扱われます。
疑問符(?) を含むカスタム演算子は定義できますが、それらは疑問符の文字のみで構成はできません。また、演算子は感嘆符(!) を含むことができますが、後置演算子は、疑問符や感嘆符のいずれかで始めることはできません。
演算子の周りの空白は、演算子が接頭辞演算子、接尾辞演算子、または挿入辞演算子として使用されるかどうかを決定するために使用されます。この動作は、以下の規則です。
これらの規則の目的のため、演算子の前の文字 (、[、 と {、演算子の後の文字 )、]、 および }、また文字 ,, ;, および : も空白文字と見なされます。
もし ! または ? の、事前に定義された演算子の左側に空白文字がなければ、それは右側に空白があるかどうかに関係なく、接尾辞演算子として扱われます。? を optional の連鎖の演算子として使うには、左に空白があってはいけません。三項条件演算子 (? :) でそれを使用するには、周りの両側に空白を書かなければなりません。
挿入辞演算子への引数の 1 つが正規表現リテラルである場合、演算子の両側のまわりには空白がなければなりません。
特定の構築物において、< または > に続く演算子は、2つ以上のトークンに分割することができます。残りは、同様に扱われ、再び分割できます。その結果、Dictionary<String, Array<Int>> のような構築物で、閉じる > の文字の間に明確にするために空白を追加する必要はありません。この例では、閉じる > 文字は、ビットシフト >> 演算子として誤って解釈され、単一のトークンとして扱われる事はありません。
新しい、カスタム演算子を定義する方法を学ぶには、カスタム演算子 と 演算子の宣言 を参照してください。既存の演算子をオーバーロードする方法を学ぶには、演算子メソッド を参照して下さい。