Swift 5.3 日本語化計画 : Swift 5.3


語彙の構造


Swift の 語彙の構造 は、一連の文字が形作る言語の有効なトークンを説明します。これらの有効なトークンは、言語の最下位レベルをビルドするブロックを形成し、後に続く章で残りの言語の部分を記述するために使用されます。トークンは、識別子、キーワード、句読点、リテラル、または演算子で構成されます。


ほとんどの場合、トークンは以下に指定された文法の制約内で、入力テキストからできるだけ長い部分文字列を考慮して Swift のソースファイルの文字から生成されます。この動作は、最長一致 または 最大かじりつき (maximal munch) と呼ばれています。



空白とコメント


空白には2つの用途があります:ソースファイルでトークンを分ける用途と、演算子が接頭辞または接尾辞 (演算子 を参照) かを決定するのに役立ちますが、それ以外は無視されます。以下の文字は空白と見なされます:スペース (U+0020)、ラインフィード(U+000A)、キャリッジリターン (U+000D)、水平タブ (U+0009)、垂直タブ (U+000B)、フォームフィード (U+000C)、そしてヌル (U+0000)。


コメントは、コンパイラによって、空白として扱われます。一行のコメントは、// で始まり、ラインフィード (U+000A) またはキャリッジリターン (U+000D) まで続きます。複数行のコメントは、/* で始まり、*/ で終わります。複数の行のコメントをネストすることは許可されていますが、コメントのマーカーは、バランスをとらなければなりません。


マークアップの書式リファレンス で説明したように、コメントは追加の書式やマークアップを含むことができます。


空白の文法

whitespacewhitespace-item ­whitespace opt
­ whitespace-itemline-break
­ whitespace-iteminline-space
whitespace-itemcomment­
whitespace-itemmultiline-comment
whitespace-item → U+0000, U+000B, or U+000C

line-break → U+000A
line-break → U+000D
line-break → U+000D followed by U+000A

inline-spacesinline-space inline-spaces opt
inline-space → U+0009 or U+0020

comment → // ­comment-text ­line-break
­ multiline-comment → /* multiline-comment-text */

­ comment-textcomment-text-item comment-text­ opt­
comment-text-item → Any Unicode scalar value except U+000A or U+000D

multiline-comment-textmultiline-comment-text-item multiline-comment-text opt
­ multiline-comment-text-itemmultiline-comment
­ multiline-comment-text-itemcomment-text-item
multiline-comment-text-item → Any Unicode scalar value except /*­ or */



識別子


識別子 は、A から Z の大文字または小文字か、アンダースコア (_) で始まる、基本多言語面での、非結合英数字の Unicode 文字、または私用領域にない基本多言語面外の文字で始まります。最初の文字の後は、数字と結合 Unicode 文字もまた許可されています。


識別子として予約語を使用するには、前と後にバッククォート(`) を置きます。例えば、class は有効な識別子ではありませんが、`class` は有効です。バッククォートは、識別子の一部とは見なされず、`x` および x は同じ意味を持ちます。


明示的でないパラメータ名を持つクロージャの内部では、パラメータは暗黙のうちに $0,$1,$2, などなどという名前が付けられます。これらの名前は、クロージャの範囲内で有効な識別子です。


コンパイラは、プロパティラッパープロジェクションを持つドル記号 ($) プロパティで始まる識別子を合成します。あなたのコードはこれらの識別子とやり取りできますが、その接頭辞を持つ識別子を宣言することはできません。詳細については、属性 の章の propertyWrapper セクションを参照してください。


識別子の文法

identifieridentifier-head identifier-characters opt­
identifier` ­identifier-head­ identifier-characters­ opt­`
identifierimplicit-parameter-name­
identifierproperty-wrapper-projection
identifier-listidentifieridentifier­ , ­identifier-list

identifier-head → Upper- or lowercase letter A through Z
identifier-head → _
­ identifier-head → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, or U+00B7–U+00BA
identifier-head → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, or U+00F8–U+00FF
identifier-head → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, or U+180F–U+1DBF
identifier-head → U+1E00–U+1FFF
identifier-head → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, or U+2060–U+206F
identifier-head → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, or U+2776–U+2793
identifier-head → U+2C00–U+2DFF or U+2E80–U+2FFF
identifier-head → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, or U+3040–U+D7FF
identifier-head → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, or U+FE30–U+FE44
identifier-head → U+FE47–U+FFFD
identifier-head → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, or U+40000–U+4FFFD
identifier-head → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, or U+80000–U+8FFFD
identifier-head → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, or U+C0000–U+CFFFD
identifier-head → U+D0000–U+DFFFD or U+E0000–U+EFFFD

identifier-character → Digit 0 through 9
identifier-character → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, or U+FE20–U+FE2F
identifier-characteridentifier-head
­ identifier-charactersidentifier-character ­identifier-characters ­opt
­
implicit-parameter-name$ decimal-digits­
property-wrapper-projection$ identifier-characters


キーワードと句読点


以下のキーワードは予約されており、それらはバッククォートでエスケープしている場合を除き、上の 識別子 に述べたように、識別子としては使用できません。inout,var, 及び let 以外のキーワードは、バッククォートでエスケープすることなく関数宣言や関数呼び出しのパラメータ名として使用できます。メンバがキーワードと同じ名前を持つ場合、そのメンバへの参照は、メンバへの参照とキーワードの使用の間に曖昧さがある場合を除いて、バッククォートでエスケープする必要はなく、例えば self,Type および Protocol が明示的なメンバ式に特殊な意味を持っている場合、それらはその文脈でバッククォートでエスケープしなければなりません。


以下のトークンは、句読点として予約されており、カスタム演算子として使用できません。(, ), {, }, [, ], ., ,, :, ;, =, @, #, &(接頭辞演算子として)、->, `, ?, そして ! (接尾辞演算子として)。



リテラル


リテラル は、数値や文字列などの型の値をソースコードで表現したものです。


リテラルの例を以下に示します。


  1. 42// Integer literal
  2. 3.14159// Floating-point literal
  3. "Hello, world!"    // String literal
  4. true// Boolean literal


リテラルには、それ独自の型はありません。その代わりに、リテラルは無限の精度を記述し、Swift の型推論はリテラルの型を推測しようとします。たとえば、let x: Int8 = 42 の宣言では、Swift は整数リテラル 42 の型は Int8 であることを推測するのに (:Int8) の明示的な型注釈を使用しています。利用可能な適切な型の情報がない場合には、Swift は、リテラルの型は Swift 標準ライブラリで定義されたデフォルトのリテラル型の一つであることを推測します。デフォルトの型は、整数リテラルの場合 Int、浮動小数点リテラルの場合 Double、文字列リテラルの場合 String、およびブール値リテラルの場合 Bool です。たとえば、let str = ”Hello,world" 宣言の中で、文字列リテラルの "Hello,world" のデフォルトに推論された型は String です。


リテラル値の型注釈を指定する場合、注釈の型は、そのリテラル値からインスタンス化することができる型でなければなりません。すなわち、型は、以下の Swift の標準ライブラリプロトコルの一つに準拠しなければならず、整数リテラルでは ExpressibleByIntegerLiteral に、浮動小数点リテラルでは ExpressibleByFloatLiteral に、文字列リテラルでは ExpressibleByStringLiteral に、ブール値リテラルでは ExpressibleByBooleanLiteral に、単一の Unicode スカラだけを含む文字列リテラルには ExpressibleByUnicodeScalarLiteral に、単一の拡張書記素クラスタだけを含む文字列リテラルでは ExpressibleByExtendedGraphemeClusterLiteral に準拠しなければなりません。たとえば、Int8ExpressibleByIntegerLiteral プロトコルに準拠し、そのため、let x: Int8 = 42 宣言では整数リテラル 42 の型注釈で使用できます。


リテラルの文法

literal numeric-literal | string-literal | boolean-literal | nil-literal
numeric-literal → - opt integer-literal- opt floating-point-literal
boolean-literal true­ | false­
nil-literal nil



整数リテラル


整数リテラル は、不特定の精度の整数値を表します。デフォルトでは、整数リテラルは十進で表現されます。接頭辞を使用して別の基数を指定できます。二進数のリテラルは 0b で始まり、八進リテラルは 0o で始まり、十六進リテラルは 0x で始まります。


十進リテラルは 0 から9 の数字を含みます。二進リテラルは、01 の数字を含み、八進リテラルは 0 から 7 を含み、十六進リテラルは 0 から 9 までと、同様に大文字または小文字の A から F を含みます。


負の整数リテラルは、-42 のように、整数リテラルにマイナス記号 (-) を付けて表されます。


アンダースコア (_)は、読みやすさのため数字の間に置くことを認められていますが、無視され、そのためリテラルの値に影響を与えません。整数リテラルは先頭をゼロ (0) で始めることができますが、それらは同様に無視され、リテラルの基数や値には影響しません。


特に指定しない限り、整数リテラルのデフォルトの推論された型は、Swift 標準ライブラリの型 Int です。整数 で説明したように、Swift 標準ライブラリも、符号付きと符号なし整数の様々なサイズの型を定義しています。


整数リテラルの文法

integer-literalbinary-literal
integer-literaloctal-literal
­ integer-literaldecimal-literal
­ integer-literalhexadecimal-literal
­
binary-literal0b ­binary-digit ­binary-literal-characters opt
binary-digit → Digit 0 or 1
binary-literal-characterbinary-digit |­ _
­ binary-literal-charactersbinary-literal-character binary-literal-characters opt

octal-literal0o ­octal-digit ­octal-literal-characters opt
octal-digit → Digit 0 through 7
octal-literal-characteroctal-digit­ | _
­ octal-literal-charactersoctal-literal-character octal-literal-characters opt

decimal-literaldecimal-digit­ decimal-literal-characters opt
decimal-digit → Digit 0 through 9
decimal-digitsdecimal-digit decimal-digits opt
­ decimal-literal-characterdecimal-digit |­ _
­ decimal-literal-charactersdecimal-literal-character decimal-literal-characters opt

hexadecimal-literal0x ­hexadecimal-digit ­hexadecimal-literal-characters opt
­ hexadecimal-digit → Digit 0 through 9, a through f, or A through F
hexadecimal-literal-characterhexadecimal-digit |­ _
hexadecimal-literal-charactershexadecimal-literal-character ­hexadecimal-literal-characters opt



浮動小数点リテラル


浮動小数点リテラル は、不特定の精度の浮動小数点値を表します。


デフォルトでは、浮動小数点リテラルは (接頭辞なしで) 十進数で表されますが、また(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 型も定義しています。


浮動小数点リテラルの文法

floating-point-literaldecimal-literal­ decimal-fraction opt ­decimal-exponent opt
floating-point-literalhexadecimal-literal ­hexadecimal-fraction opt hexadecimal-exponent

decimal-fraction. ­decimal-literal
decimal-exponentfloating-point-e ­sign­ opt decimal-literal

hexadecimal-fraction. hexadecimal-digit hexadecimal-literal-characters opt
hexadecimal-exponentfloating-point-p sign opt ­decimal-literal

floating-point-ee­ | E
­ floating-point-ppP
sign+-­



文字列のリテラル


文字列リテラルは、引用符で囲まれた一連の文字です。単一の行の文字列リテラルは二重引用符で囲まれ、以下の形式をとります。


"


文字列のリテラルは、エスケープされていない二重引用符 (")、エスケープされていないバックスラッシュ (\)、キャリッジリターン、またはラインフィードをを含めることはできません。


複数行の文字列リテラルは、3つの二重引用符で囲まれ、以下の形式です。


"""

"""



単一行の文字列リテラルとは異なり、複数行の文字列リテラルには、エスケープされていない二重引用符 (")、キャリッジリターン、ラインフィードを含めることができます。3つのエスケープされていない二重引用符を互いに隣接して含むことはできません。


複数行の文字列リテラルを開始する """ の後の改行は文字列の一部ではありません。リテラルを終了する """ の前の改行もまた文字列の一部ではありません。ラインフィードで始まるか終わる複数行の文字列リテラルを作成するには、最初または最後の行に空の行を記述します。


複数行の文字列リテラルは、空白とタブの任意の組み合わせを使用してインデントすることができます。このインデントは文字列には含まれません。リテラルを終了する """ が、インデントを決定します。リテラル内の空白でない行はすべて、終了する """ の前に表示されるインデントとまったく同じインデントで始まらなければなりません。タブとスペースの間を変えてはいけません。そのインデントの後にスペースとタブを追加することができます。それらのスペースとタブが文字列に表示されます。


複数行文字列リテラル内の改行は、ラインフィードの文字を使用するために正規化されます。ソースファイルにキャリッジリターンとラインフィードが混在していても、文字列内の改行はすべて同じになります。


複数行の文字列リテラルでは、行の最後にバックスラッシュ (\) を書くと、その文字列から改行が省略されます。バックスラッシュと改行の間の空白も省略されます。この構文を使用して、結果の文字列の値を変更することなく、ソースコード内で複数行の文字列リテラルをハードラップ (hard wrap) することができます。


以下のエスケープシーケンスを使用して、単一行と複数行形式の両方の文字列リテラルに特殊文字を含めることができます。


式の値は、バックスラッシュ (\) の後の括弧内に式を配置することによって文字列リテラル内に挿入できます。補間された式は、文字列リテラルを含められますが、エスケープされていないバックスラッシュ、キャリッジリターン、またはラインフィードをを含めることはできません。


たとえば、以下のすべての文字列リテラルは同じ値を持っています:


  1. "1 2 3"
  2. "1 2 \("3")"
  3. "1 2 \(3)"
  4. "1 2 \(1 + 2)"
  5. let x = 3; "1 2 \(x)"


拡張区切り文字で区切られた文字列は、引用符と 1 つ以上のシャープ記号 () のバランスの取れたセットで囲まれた一連の文字です。拡張区切り文字で区切られた文字列の形式は以下のとおりです。


拡張区切り文字で区切られた文字列内の特殊文字は、特殊文字としてではなく通常の文字として結果の文字列に表示されます。拡張区切り文字を使用して、通常は文字列補間の生成や、エスケープシーケンスの開始や、文字列の終了などの特殊効果を持つ文字を含む文字列を作成できます。


以下の例は、文字列リテラルと、同等の文字列値を作成する拡張区切り文字で区切られた文字列を示しています。


  1. let string = #"\(x) \ " \u{2603}"#
  2. let escaped = "\\(x) \\ \" \\u{2603}"
  3. print(string)
  4. // Prints "\(x) \ " \u{2603}"
  5. print(string == escaped)
  6. // Prints "true"


複数のシャープ記号 (#) を使用して拡張区切り文字で区切られた文字列を形成する場合、シャープ記号同士の間に空白を入れないでください。


  1. print(###"Line 1\###nLine 2"###) // OK
  2. print(# # #"Line 1\# # #nLine 2"# # #) // Error


拡張区切り文字を使用して作成する複数行文字列リテラルには、通常の複数行文字列リテラルと同じインデント要件があります。


文字列リテラルのデフォルトの推論された型は String です。String 型の詳細については、文字列と文字 と、 String を参照してください。


+ 演算子で連結された文字列リテラルは、コンパイル時に連結されます。たとえば、以下の例の textAtextB の値は、同一です。実行時の連結は行なわれません。


  1. let textA = "Hello " + "world"
  2. let textB = "Hello world"


文字列リテラルの文法

string-literalstatic-string-literal | interpolated-string-literal

string-literal-opening-delimiterextended-string-literal-delimiter opt "
string-literal-closing-delimiter → " extended-string-literal-delimiter opt

static-string-literalstring-literal-opening-delimiter ­quoted-text­ opt string-literal-closing-delimiter
static-string-literalmultiline-string-literal-opening-delimiter multiline-quoted-text opt multiline-string-literal-closing-delimiter

multiline-string-literal-opening-delimiterextended-string-literal-delimiter """
multiline-string-literal-closing-delimiter → """ extended-string-literal-delimiter
extended-string-literal-delimiter → # extended-string-literal-delimiter opt

quoted-textquoted-text-item ­quoted-text opt
quoted-text-itemescaped-character
quoted-text-item → Any Unicode scalar value except ", \, U+000A, or U+000D

multiline-quoted-textmultiline-quoted-text-item ­multiline-quoted-text ­opt
multiline-quoted-text-itemescaped-character
multiline-quoted-text-item → Any Unicode scalar value except \
multiline-quoted-text-itemescaped-newline

interpolated-string-literalstring-literal-opening-delimiter interpolated-text opt string-literal-closing-delimiter
interpolated-string-literalmultiline-string-literal-opening-delimiter interpolated-text opt multiline-string-literal-closing-delimiter

­ interpolated-textinterpolated-text-item ­interpolated-text ­opt
interpolated-text-item\(expression) | quoted-text-item

multiline-interpolated-textmultiline-interpolated-text-item ­multiline-interpolated-text ­opt­
multiline-interpolated-text-item\expression­)­ | multiline-quoted-text-item

escape-sequence\ extended-string-literal-delimiter
­ escaped-characterescape-sequence 0 | escape-sequence \ | escape-sequence t | escape-sequence n | escape-sequence r | escape-sequence " | escape-sequence '
escaped-characterescape-sequence u { unicode-scalar-digits }
unicode-scalar-digits → Between one and eight hexadecimal digits

escaped-newlineescape-sequence inline-spaces ­opt ­line-break



演算子


Swift の標準ライブラリでは、使えるように数多くの演算子を定義しており、その多くは 基本演算子 および 高度な演算子 で議論されています。本セクションでは、どの文字がカスタムの演算子を定義するために使用できるか説明します。


カスタム演算子は、/, =, -, +, !, *, %, <, >, &, |, ^, ?, または ~ 、の ASCII 文字の内の一つで始まるか、または以下の文法で定義されている Unicode 文字の一つで始まります(これは、算術演算子、その他の記号、および Dingbats Unicode ブロック、その他からの文字を含みます)。最初の文字の後には、Unicode 文字を組み合わせたものも許可されます。


また、ドット(.) で始まるカスタム演算子を定義することもできます。これらの演算子は、追加のドットを含めることができます。たとえば、.+. は単一の演算子として扱われます。演算子が、ドットで始まらない場合、他の場所にドットを含めることはできません。例えば、+.+ は、.+ 演算子が続く + 演算子として扱われます。


疑問符(?) を含むカスタム演算子は定義できますが、それらは疑問符の文字のみで構成はできません。また、演算子は感嘆符(!) を含むことができますが、後置演算子は、疑問符や感嘆符のいずれかで始めることはできません。


注意: =, ->, //, /*, */, ., のトークン、接頭辞演算子 <,&,?, 挿入辞演算子 ?, 接尾辞演算子の >,!,? は予約されています。これらのトークンは、オーバーロードできず、またそれらは、カスタム演算子として使用することはできません。


演算子の周りの空白は、演算子が接頭辞演算子、接尾辞演算子、または二項演算子として使用されるかどうかを決定するために使用されます。この動作は、以下の規則に要約されます。


これらの規則の目的のため、演算子の前の文字 (、[、{、演算子の後の文字 )、]、 および }、また文字 ,, ;, および : も空白文字と見なされます。


上記の規則には注意点が 1 つあります。もし ! または ? の、事前に定義された演算子の左側に空白文字がなければ、それは右側に空白があるかどうかに関係なく、接尾辞演算子として扱われます。? を optional の連鎖の演算子として使うには、左に空白があってはいけません。三項条件演算子 (? :) でそれを使用するには、周りの両側に空白を書かなければなりません。


特定の構築物において、< または > に続く演算子は、2つ以上のトークンに分割することができます。残りは、同様に扱われ、再び分割できます。その結果、Dictionary<String, Array<Int>> のような構築物で、閉じる > の文字の間に明確にするために空白を使用する必要はありません。この例では、閉じる > 文字は、ビットシフト >> 演算子として誤って解釈され、単一のトークンとして扱われる事はありません。


新しい、カスタム演算子を定義する方法を学ぶには、カスタム演算子演算子の宣言 を参照してください。既存の演算子をオーバーロードする方法を学ぶには、演算子メソッド を参照して下さい。


演算子の文法

operatoroperator-head ­operator-characters opt
operatordot-operator-head ­dot-operator-characters opt

operator-head/=-+!* ­| % | >&|^~ | ­?
­ operator-head → U+00A1–U+00A7
operator-head → U+00A9 or U+00AB
operator-head → U+00AC or U+00AE
operator-head → U+00B0–U+00B1,
operator-head → U+00B6, U+00BB, U+00BF, U+00D7, or U+00F7
operator-head → U+2016–U+2017
operator-head → U+2020–U+2027
operator-head → U+2030–U+203E
operator-head → U+2041–U+2053
operator-head → U+2055–U+205E
operator-head → U+2190–U+23FF
operator-head → U+2500–U+2775
operator-head → U+2794–U+2BFF
operator-head → U+2E00–U+2E7F
operator-head → U+3001–U+3003
operator-head → U+3008–U+3020
operator-head → U+3030
operator-characteroperator-head
operator-character → U+0300–U+036F
operator-character → U+1DC0–U+1DFF
operator-character → U+20D0–U+20FF
operator-character → U+FE00–U+FE0F
operator-character → U+FE20–U+FE2F
operator-character → U+E0100–U+E01EF
operator-charactersoperator-character ­operator-characters opt

dot-operator-head → .
­ dot-operator-character → .­ | operator-character
dot-operator-charactersdot-operator-character ­dot-operator-characters opt

binary-operatoroperator
prefix-operatoroperator
postfix-operatoroperator



前:言語リファレンスについて 次:型
















トップへ












トップへ












トップへ












トップへ












トップへ
目次
Xcode の新機能

Swift について
Swift と Cocoa と Objective-C (obsolete)
Swift Blog より (obsolete)

SwiftLogo
  • Swift 5.3 全メニュー


  • Swift へようこそ
  • Swift について

  • Swift 言語のガイド

  • 言語リファレンス
  • 言語リファレンスについて
  • 語彙の構造



  • 宣言
  • 属性
  • パターン
  • 汎用パラメータと引数
  • 文法のまとめ

  • マニュアルの変更履歴













  • トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ