Spec-Zone.ru › Swift Language

Сводка грамматики

Прочитайте всю формальную грамматику.

Лексическая структура

Грамматика пробелов:

пробел → элемент-пробела пробел_?_
элемент-пробела → перевод-строки
элемент-пробела → внутристрочный-пробел
элемент-пробела → комментарий
элемент-пробела → многострочный-комментарий
элемент-пробела → U+0000, U+000B или U+000C

перевод-строки → U+000A
перевод-строки → U+000D
перевод-строки → U+000D, за которым следует U+000A

внутристрочный-пробел → внутристрочный-пробел-элемент внутристрочный-пробел_?_
внутристрочный-пробел-элемент → U+0009 или U+0020

комментарий → // текст-комментария перевод-строки
многострочный-комментарий → /* текст-многострочного-комментария */

текст-комментария → элемент-текста-комментария текст-комментария_?_
элемент-текста-комментария → Любое скалярное значение Юникода, кроме U+000A или U+000D

текст-многострочного-комментария → элемент-текста-многострочного-комментария текст-многострочного-комментария_?_
элемент-текста-многострочного-комментария → многострочный-комментарий
элемент-текста-многострочного-комментария → элемент-текста-комментария
элемент-текста-многострочного-комментария → Любое скалярное значение Юникода, кроме /* или */

Грамматика идентификатора:

идентификатор → начало-идентификатора символы-идентификатора_?_
идентификатор → ` начало-идентификатора символы-идентификатора_?_ `
идентификатор → имя-неявного-параметра
идентификатор → проекция-обертки-свойства
список-идентификаторов → идентификатор | идентификатор , список-идентификаторов

начало-идентификатора → Буква от A до Z в верхнем или нижнем регистре
начало-идентификатора → _
начало-идентификатора → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, или U+00B7–U+00BA
начало-идентификатора → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, или U+00F8–U+00FF
начало-идентификатора → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, или U+180F–U+1DBF
начало-идентификатора → U+1E00–U+1FFF
начало-идентификатора → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, или U+2060–U+206F
начало-идентификатора → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, или U+2776–U+2793
начало-идентификатора → U+2C00–U+2DFF или U+2E80–U+2FFF
начало-идентификатора → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, или U+3040–U+D7FF
начало-идентификатора → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, или U+FE30–U+FE44
начало-идентификатора → U+FE47–U+FFFD
начало-идентификатора → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, или U+40000–U+4FFFD
начало-идентификатора → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, или U+80000–U+8FFFD
начало-идентификатора → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, или U+C0000–U+CFFFD
начало-идентификатора → U+D0000–U+DFFFD или U+E0000–U+EFFFD

символ-идентификатора → Цифра от 0 до 9
символ-идентификатора → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, или U+FE20–U+FE2F
символ-идентификатора → начало-идентификатора
символы-идентификатора → символ-идентификатора символы-идентификатора_?_

имя-неявного-параметра → $ десятичные-цифры
проекция-обертки-свойства → $ символы-идентификатора

Грамматика литерала:

литерал → числовой-литерал | строковый-литерал | литерал-регулярного-выражения | булевый-литерал | литерал-nil

числовой-литерал → -_?_ целочисленный-литерал | -_?_ число-с-плавающей-точкой
булевый-литерал → true | false
литерал-nil → nil

Грамматика целочисленного литерала:

целочисленный-литерал → двоичный-литерал
целочисленный-литерал → восьмеричный-литерал
целочисленный-литерал → десятичный-литерал
целочисленный-литерал → шестнадцатеричный-литерал

двоичный-литерал → 0b двоичная-цифра символы-двоичного-литерала_?_
двоичная-цифра → Цифра 0 или 1
символ-двоичного-литерала → двоичная-цифра | _
символы-двоичного-литерала → символ-двоичного-литерала символы-двоичного-литерала_?_

восьмеричный-литерал → 0o восьмеричная-цифра символы-восьмеричного-литерала_?_
восьмеричная-цифра → Цифра от 0 до 7
символ-восьмеричного-литерала → восьмеричная-цифра | _
символы-восьмеричного-литерала → символ-восьмеричного-литерала символы-восьмеричного-литерала_?_

десятичный-литерал → десятичная-цифра символы-десятичного-литерала_?_
десятичная-цифра → Цифра от 0 до 9
десятичные-цифры → десятичная-цифра десятичные-цифры_?_
символ-десятичного-литерала → десятичная-цифра | _
символы-десятичного-литерала → символ-десятичного-литерала символы-десятичного-литерала_?_

шестнадцатеричный-литерал → 0x шестнадцатеричная-цифра символы-шестнадцатеричного-литерала_?_
шестнадцатеричная-цифра → Цифра от 0 до 9, a до f, или A до F
символ-шестнадцатеричного-литерала → шестнадцатеричная-цифра | _
символы-шестнадцатеричного-литерала → символ-шестнадцатеричного-литерала символы-шестнадцатеричного-литерала_?_

Грамматика числа с плавающей точкой:

число-с-плавающей-точкой → десятичный-литерал десятичная-дробная_?_ десятичный-экспоненциальный_?_
число-с-плавающей-точкой → шестнадцатеричный-литерал шестнадцатеричная-дробная_?_ шестнадцатеричный-экспоненциальный

десятичная-дробная → . десятичный-литерал
десятичный-экспоненциальный → floating-point-e знак_?_ десятичный-литерал

шестнадцатеричная-дробная → . шестнадцатеричная-цифра символы-шестнадцатеричного-литерала_?_
шестнадцатеричный-экспоненциальный → floating-point-p знак_?_ десятичный-литерал

floating-point-e → e | E
floating-point-p → p | P
знак → + | -

Грамматика строкового литерала:

строковый-литерал → статический-строковый-литерал | интерполированный-строковый-литерал

открывающий-разделитель-строкового-литерала → расширенный-разделитель-строкового-литерала_?_ "
закрывающий-разделитель-строкового-литерала → " расширенный-разделитель-строкового-литерала_?_

статический-строковый-литерал → открывающий-разделитель-строкового-литерала цитированный-текст_?_ закрывающий-разделитель-строкового-литерала
статический-строковый-литерал → открывающий-разделитель-многострочного-строкового-литерала многострочный-цитированный-текст_?_ закрывающий-разделитель-многострочного-строкового-литерала

открывающий-разделитель-многострочного-строкового-литерала → расширенный-разделитель-строкового-литерала_?_ """
закрывающий-разделитель-многострочного-строкового-литерала → """ расширенный-разделитель-строкового-литерала_?_
расширенный-разделитель-строкового-литерала → # расширенный-разделитель-строкового-литерала_?_

цитированный-текст → элемент-цитированного-текста цитированный-текст_?_
элемент-цитированного-текста → экранированный-символ
элемент-цитированного-текста → Любое скалярное значение Юникода, кроме ", \, U+000A или U+000D

многострочный-цитированный-текст → элемент-многострочного-цитированного-текста многострочный-цитированный-текст_?_
элемент-многострочного-цитированного-текста → экранированный-символ
элемент-многострочного-цитированного-текста → Любое скалярное значение Юникода, кроме \
элемент-многострочного-цитированного-текста → экранированная-новая-строка

интерполированный-строковый-литерал → открывающий-разделитель-строкового-литерала интерполированный-текст_?_ закрывающий-разделитель-строкового-литерала
интерполированный-строковый-литерал → открывающий-разделитель-многострочного-строкового-литерала многострочный-интерполированный-текст_?_ закрывающий-разделитель-многострочного-строкового-литерала

интерполированный-текст → элемент-интерполированного-текста интерполированный-текст_?_
элемент-интерполированного-текста → \( выражение ) | элемент-цитированного-текста

многострочный-интерполированный-текст → элемент-многострочного-интерполированного-текста многострочный-интерполированный-текст_?_
элемент-многострочного-интерполированного-текста → \( выражение ) | элемент-многострочного-цитированного-текста

последовательность-экранирования → \ расширенный-разделитель-строкового-литерала
экранированный-символ → последовательность-экранирования 0 | последовательность-экранирования \ | последовательность-экранирования t | последовательность-экранирования n | последовательность-экранирования r | последовательность-экранирования " | последовательность-экранирования '
экранированный-символ → последовательность-экранирования u { цифры-скалярного-значения-юникода }
цифры-скалярного-значения-юникода → От одной до восьми шестнадцатеричных цифр

экранированная-новая-строка → последовательность-экранирования внутристрочный-пробел_?_ перевод-строки

Грамматика литерала регулярного выражения:

regular-expression-literal → regular-expression-literal-opening-delimiter regular-expression regular-expression-literal-closing-delimiter
regular-expression → Любое регулярное выражение

regular-expression-literal-opening-delimiter → extended-regular-expression-literal-delimiter_?_ /
regular-expression-literal-closing-delimiter → / extended-regular-expression-literal-delimiter_?_

extended-regular-expression-literal-delimiter → # extended-regular-expression-literal-delimiter_?_

Грамматика операторов:

operator → operator-head operator-characters_?_
operator → dot-operator-head dot-operator-characters

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-character → operator-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-characters → operator-character operator-characters_?_

dot-operator-head → .
dot-operator-character → . | operator-character
dot-operator-characters → dot-operator-character dot-operator-characters_?_

infix-operator → operator
prefix-operator → operator
postfix-operator → operator

Типы

Грамматика типа:

type → function-type
type → array-type
type → dictionary-type
type → type-identifier
type → tuple-type
type → optional-type
type → implicitly-unwrapped-optional-type
type → protocol-composition-type
type → opaque-type
type → metatype-type
type → any-type
type → self-type
type → ( type )

Грамматика аннотации типа:

type-annotation → : attributes_?_ inout_?_ type

Грамматика идентификатора типа:

type-identifier → type-name generic-argument-clause_?_ | type-name generic-argument-clause_?_ . type-identifier
type-name → identifier

Грамматика кортежа типа:

tuple-type → ( ) | ( tuple-type-element , tuple-type-element-list )
tuple-type-element-list → tuple-type-element | tuple-type-element , tuple-type-element-list
tuple-type-element → element-name type-annotation | type
element-name → identifier

Грамматика типа функции:

function-type → attributes_?_ function-type-argument-clause async_?_ throws-clause_?_ -> type

function-type-argument-clause → ( )
function-type-argument-clause → ( function-type-argument-list ..._?_ )

function-type-argument-list → function-type-argument | function-type-argument , function-type-argument-list
function-type-argument → attributes_?_ inout_?_ type | argument-label type-annotation
argument-label → identifier

throws-clause → throws | throws ( type )

Грамматика типа массива:

array-type → [ type ]

Грамматика типа словаря:

dictionary-type → [ type : type ]

Грамматика типа необязательного значения:

optional-type → type ?

Грамматика типа неявно раскрытого необязательного значения:

implicitly-unwrapped-optional-type → type !

Грамматика типа композиции протокола:

protocol-composition-type → type-identifier & protocol-composition-continuation
protocol-composition-continuation → type-identifier | protocol-composition-type

Грамматика неявного типа:

opaque-type → some type

Грамматика типа протокола в ящике:

boxed-protocol-type → any type

Грамматика типа метатипа:

metatype-type → type . Type | type . Protocol

Грамматика типа Any:

any-type → Any

Грамматика типа Self:

self-type → Self

Грамматика условия наследования типа:

type-inheritance-clause → : type-inheritance-list
type-inheritance-list → attributes_?_ type-identifier | attributes_?_ type-identifier , type-inheritance-list

Выражения

Грамматика выражения:

expression → try-operator_?_ await-operator_?_ prefix-expression infix-expressions_?_

Грамматика префиксного выражения:

prefix-expression → prefix-operator_?_ postfix-expression
prefix-expression → in-out-expression

Грамматика выражения in-out:

in-out-expression → & primary-expression

Грамматика выражения try:

try-operator → try | try ? | try !

Грамматика выражения await:

await-operator → await

Грамматика инфиксного выражения:

infix-expression → infix-operator prefix-expression
infix-expression → assignment-operator try-operator_?_ await-operator_?_ prefix-expression
infix-expression → conditional-operator try-operator_?_ await-operator_?_ prefix-expression
infix-expression → type-casting-operator
infix-expressions → infix-expression infix-expressions_?_

Грамматика оператора присваивания:

assignment-operator → =

Грамматика условного оператора:

conditional-operator → ? expression :

Грамматика оператора приведения типов:

type-casting-operator → is type
type-casting-operator → as type
type-casting-operator → as ? type
type-casting-operator → as ! type

Грамматика выражения основного уровня:

primary-expression → identifier generic-argument-clause_?_
primary-expression → literal-expression
primary-expression → self-expression
primary-expression → superclass-expression
primary-expression → conditional-expression
primary-expression → closure-expression
primary-expression → parenthesized-expression
primary-expression → tuple-expression
primary-expression → implicit-member-expression
primary-expression → wildcard-expression
primary-expression → macro-expansion-expression
primary-expression → key-path-expression
primary-expression → selector-expression
primary-expression → key-path-string-expression

Грамматика выражения литерала:

literal-expression → literal
literal-expression → array-literal | dictionary-literal | playground-literal

array-literal → [ array-literal-items_?_ ]
array-literal-items → array-literal-item ,_?_ | array-literal-item , array-literal-items
array-literal-item → expression

dictionary-literal → [ dictionary-literal-items ] | [ : ]
dictionary-literal-items → dictionary-literal-item ,_?_ | 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-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

Грамматика выражения суперкласса:

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

Грамматика условного выражения:

conditional-expression → if-expression | switch-expression

if-expression → if condition-list { statement } if-expression-tail
if-expression-tail → else if-expression
if-expression-tail → else { statement }

switch-expression → switch expression { switch-expression-cases }
switch-expression-cases → switch-expression-case switch-expression-cases_?_
switch-expression-case → case-label statement
switch-expression-case → default-label statement

Грамматика выражения замыкания:

closure-expression → { attributes_?_ closure-signature_?_ statements_?_ }

closure-signature → capture-list_?_ closure-parameter-clause async_?_ throws-clause_?_ function-result_?_ in
closure-signature → capture-list in

closure-parameter-clause → ( ) | ( closure-parameter-list ) | identifier-list
closure-parameter-list → closure-parameter | closure-parameter , closure-parameter-list
closure-parameter → closure-parameter-name type-annotation_?_
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-specifier_?_ identifier
capture-list-item → capture-specifier_?_ identifier = expression
capture-list-item → capture-specifier_?_ self-expression
capture-specifier → weak | unowned | unowned(safe) | unowned(unsafe)

Грамматика выражения неявного члена:

implicit-member-expression → . identifier
implicit-member-expression → . identifier . postfix-expression

Грамматика выражения в скобках:

parenthesized-expression → ( expression )

Грамматика выражения кортежа:

tuple-expression → ( ) | ( tuple-element , tuple-element-list )
tuple-element-list → tuple-element | tuple-element , tuple-element-list
tuple-element → expression | identifier : expression

Грамматика выражения с символом подстановки:

wildcard-expression → _

Грамматика выражения макрорасширения:

macro-expansion-expression → # identifier generic-argument-clause_?_ function-call-argument-clause_?_ trailing-closures_?_

Грамматика выражения пути ключа:

key-path-expression → \ type_?_ . key-path-components
key-path-components → key-path-component | key-path-component . key-path-components
key-path-component → identifier key-path-postfixes_?_ | key-path-postfixes

key-path-postfixes → key-path-postfix key-path-postfixes_?_
key-path-postfix → ? | ! | self | [ function-call-argument-list ]

END_OF_DOCUMENT_MARKER

Грамматика выражения селектора:

selector-expression → #selector ( expression )
selector-expression → #selector ( getter: expression )
selector-expression → #selector ( setter: expression )

Грамматика выражения строки ключевого пути:

key-path-string-expression → #keyPath ( 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

Грамматика выражения вызова функции:

function-call-expression → postfix-expression function-call-argument-clause
function-call-expression → postfix-expression function-call-argument-clause_?_ trailing-closures

function-call-argument-clause → ( ) | ( function-call-argument-list )
function-call-argument-list → function-call-argument | function-call-argument , function-call-argument-list
function-call-argument → expression | identifier : expression
function-call-argument → operator | identifier : operator

trailing-closures → closure-expression labeled-trailing-closures_?_
labeled-trailing-closures → labeled-trailing-closure labeled-trailing-closures_?_
labeled-trailing-closure → identifier : closure-expression

Грамматика выражения инициализации:

initializer-expression → postfix-expression . init
initializer-expression → postfix-expression . init ( argument-names )

Грамматика выражения явного члена:

explicit-member-expression → postfix-expression . decimal-digits
explicit-member-expression → postfix-expression . identifier generic-argument-clause_?_
explicit-member-expression → postfix-expression . identifier ( argument-names )
explicit-member-expression → postfix-expression conditional-compilation-block

argument-names → argument-name argument-names_?_
argument-name → identifier :

Грамматика выражения постфиксного "self":

postfix-self-expression → postfix-expression . self

Грамматика выражения индексации:

subscript-expression → postfix-expression [ function-call-argument-list ]

Грамматика выражения принудительного значения:

forced-value-expression → postfix-expression !

Грамматика выражения необязательной цепочки:

optional-chaining-expression → postfix-expression ?

Операторы

Грамматика оператора:

statement → expression ;_?_
statement → declaration ;_?_
statement → loop-statement ;_?_
statement → branch-statement ;_?_
statement → labeled-statement ;_?_
statement → control-transfer-statement ;_?_
statement → defer-statement ;_?_
statement → do-statement ;_?_
statement → compiler-control-statement
statements → statement statements_?_

Грамматика оператора цикла:

loop-statement → for-in-statement
loop-statement → while-statement
loop-statement → repeat-while-statement

Грамматика оператора for-in:

for-in-statement → for case_?_ pattern in expression where-clause_?_ code-block

Грамматика оператора while:

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:

repeat-while-statement → repeat code-block while expression

Грамматика оператора ветвления:

branch-statement → if-statement
branch-statement → guard-statement
branch-statement → switch-statement

Грамматика оператора if:

if-statement → if condition-list code-block else-clause_?_
else-clause → else code-block | else if-statement

Грамматика оператора guard:

guard-statement → guard condition-list else code-block

Грамматика оператора switch:

switch-statement → switch expression { switch-cases_?_ }
switch-cases → switch-case switch-cases_?_
switch-case → case-label statements
switch-case → default-label statements
switch-case → conditional-switch-case

case-label → attributes_?_ case case-item-list :
case-item-list → pattern where-clause_?_ | pattern where-clause_?_ , case-item-list
default-label → attributes_?_ default :

where-clause → where where-expression
where-expression → expression

conditional-switch-case → switch-if-directive-clause switch-elseif-directive-clauses_?_ switch-else-directive-clause_?_ endif-directive
switch-if-directive-clause → if-directive compilation-condition switch-cases_?_
switch-elseif-directive-clauses → elseif-directive-clause switch-elseif-directive-clauses_?_
switch-elseif-directive-clause → elseif-directive compilation-condition switch-cases_?_
switch-else-directive-clause → else-directive switch-cases_?_

Грамматика метки оператора:

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

Грамматика оператора передачи управления:

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:

break-statement → break label-name_?_

Грамматика оператора continue:

continue-statement → continue label-name_?_

Грамматика оператора fallthrough:

fallthrough-statement → fallthrough

Грамматика оператора return:

return-statement → return expression_?_

Грамматика оператора throw:

throw-statement → throw expression

Грамматика оператора defer:

defer-statement → defer code-block

Грамматика оператора do:

do-statement → do throws-clause_?_ code-block catch-clauses_?_
catch-clauses → catch-clause catch-clauses_?_
catch-clause → catch catch-pattern-list_?_ code-block
catch-pattern-list → catch-pattern | catch-pattern , catch-pattern-list
catch-pattern → pattern where-clause_?_

Грамматика оператора управления компилятором:

compiler-control-statement → conditional-compilation-block
compiler-control-statement → line-control-statement
compiler-control-statement → diagnostic-statement

Грамматика блока условной компиляции:

conditional-compilation-block → if-directive-clause elseif-directive-clauses_?_ else-directive-clause_?_ endif-directive

if-directive-clause → if-directive compilation-condition statements_?_
elseif-directive-clauses → elseif-directive-clause elseif-directive-clauses_?_
elseif-directive-clause → elseif-directive compilation-condition statements_?_
else-directive-clause → else-directive statements_?_
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 ( import-path )
platform-condition → targetEnvironment ( environment )

operating-system → macOS | iOS | watchOS | tvOS | visionOS | Linux | Windows
architecture → i386 | x86_64 | arm | arm64
swift-version → decimal-digits swift-version-continuation_?_
swift-version-continuation → . decimal-digits swift-version-continuation_?_
environment → simulator | macCatalyst

Грамматика оператора управления строкой:

line-control-statement → #sourceLocation ( file: file-path , line: line-number )
line-control-statement → #sourceLocation ( )
line-number → Десятичное целое число, большее нуля
file-path → static-string-literal

Грамматика условия доступности:

availability-condition → #available ( availability-arguments )
availability-condition → #unavailable ( 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 | watchOSApplicationExtension
platform-name → tvOS | tvOSApplicationExtension
platform-name → visionOS | visionOSApplicationExtension
platform-version → decimal-digits
platform-version → decimal-digits . decimal-digits
platform-version → decimal-digits . decimal-digits . decimal-digits

Объявления

Грамматика объявления:

declaration → import-declaration
declaration → constant-declaration
declaration → variable-declaration
declaration → typealias-declaration
declaration → function-declaration
declaration → enum-declaration
declaration → struct-declaration
declaration → class-declaration
declaration → actor-declaration
declaration → protocol-declaration
declaration → initializer-declaration
declaration → deinitializer-declaration
declaration → extension-declaration
declaration → subscript-declaration
declaration → operator-declaration
declaration → precedence-group-declaration

Грамматика объявления на верхнем уровне:

top-level-declaration → statements_?_

Грамматика блока кода:

code-block → { statements_?_ }

Грамматика оператора импорта:

import-declaration → attributes_?_ import import-kind_?_ import-path

import-kind → typealias | struct | class | enum | protocol | let | var | func
import-path → identifier | identifier . import-path

Грамматика объявления константы:

constant-declaration → attributes_?_ declaration-modifiers_?_ let pattern-initializer-list

pattern-initializer-list → pattern-initializer | pattern-initializer , pattern-initializer-list
pattern-initializer → pattern initializer_?_
initializer → = expression

Грамматика объявления переменной:

объявление-переменной → заголовок-объявления-переменной список-инициализаторов-шаблонов
объявление-переменной → заголовок-объявления-переменной имя-переменной аннотация-типа блок-кода
объявление-переменной → заголовок-объявления-переменной имя-переменной аннотация-типа блок-геттера-сеттера
объявление-переменной → заголовок-объявления-переменной имя-переменной аннотация-типа блок-геттера-сеттера-ключевых-слов
объявление-переменной → заголовок-объявления-переменной имя-переменной инициализатор блок-willSet-didSet
объявление-переменной → заголовок-объявления-переменной имя-переменной аннотация-типа инициализатор_?_ блок-willSet-didSet

заголовок-объявления-переменной → атрибуты_?_ модификаторы-объявления_?_ var
имя-переменной → идентификатор

блок-геттера-сеттера → блок-кода
блок-геттера-сеттера → { оператор-геттера оператор-сеттера_?_ }
блок-геттера-сеттера → { оператор-сеттера оператор-геттера }
оператор-геттера → атрибуты_?_ модификатор-мутации_?_ get блок-кода
оператор-сеттера → атрибуты_?_ модификатор-мутации_?_ set имя-сеттера_?_ блок-кода
имя-сеттера → ( идентификатор )

блок-геттера-сеттера-ключевых-слов → { оператор-геттера-ключевых-слов оператор-сеттера-ключевых-слов_?_ }
блок-геттера-сеттера-ключевых-слов → { оператор-сеттера-ключевых-слов оператор-геттера-ключевых-слов }
оператор-геттера-ключевых-слов → атрибуты_?_ модификатор-мутации_?_ get
оператор-сеттера-ключевых-слов → атрибуты_?_ модификатор-мутации_?_ set

блок-willSet-didSet → { оператор-willSet оператор-didSet_?_ }
блок-willSet-didSet → { оператор-didSet оператор-willSet_?_ }
оператор-willSet → атрибуты_?_ willSet имя-сеттера_?_ блок-кода
оператор-didSet → атрибуты_?_ didSet имя-сеттера_?_ блок-кода

Грамматика объявления псевдонима типа:

объявление-псевдонима-типа → атрибуты_?_ модификатор-уровня-доступа_?_ typealias имя-псевдонима-типа оператор-параметров-обобщения_?_ присваивание-псевдонима-типа
имя-псевдонима-типа → идентификатор
присваивание-псевдонима-типа → = тип

Грамматика объявления функции:

объявление-функции → заголовок-функции имя-функции оператор-параметров-обобщения_?_ сигнатура-функции оператор-where-обобщения_?_ тело-функции_?_
заголовок-функции → атрибуты_?_ модификаторы-объявления_?_ func
имя-функции → идентификатор | оператор

сигнатура-функции → оператор-списка-параметров async_?_ оператор-throws_?_ результат-функции_?_
сигнатура-функции → оператор-списка-параметров async_?_ rethrows результат-функции_?_
результат-функции → -> атрибуты_?_ тип
тело-функции → блок-кода

оператор-списка-параметров → ( ) | ( список-параметров )
список-параметров → параметр | параметр , список-параметров
параметр → внешнее-имя-параметра_?_ локальное-имя-параметра аннотация-типа-параметра оператор-значения-по-умолчанию_?_
параметр → внешнее-имя-параметра_?_ локальное-имя-параметра аннотация-типа-параметра
параметр → внешнее-имя-параметра_?_ локальное-имя-параметра аннотация-типа-параметра ...

внешнее-имя-параметра → идентификатор
локальное-имя-параметра → идентификатор
аннотация-типа-параметра → : атрибуты_?_ модификатор-параметра_?_ тип
модификатор-параметра → inout | borrowing | consuming оператор-значения-по-умолчанию → = выражение

Грамматика объявления перечисления:

объявление-перечисления → атрибуты_?_ модификатор-уровня-доступа_?_ перечисление-стиля-объединения
объявление-перечисления → атрибуты_?_ модификатор-уровня-доступа_?_ перечисление-стиля-сырого-значения

перечисление-стиля-объединения → indirect_?_ enum имя-перечисления оператор-параметров-обобщения_?_ оператор-наследования-типов_?_ оператор-where-обобщения_?_ { члены-перечисления-стиля-объединения_?_ }
члены-перечисления-стиля-объединения → член-перечисления-стиля-объединения члены-перечисления-стиля-объединения_?_
член-перечисления-стиля-объединения → объявление | оператор-случая-перечисления-стиля-объединения | управляющая-инструкция-компилятора
оператор-случая-перечисления-стиля-объединения → атрибуты_?_ indirect_?_ case список-случаев-перечисления-стиля-объединения
список-случаев-перечисления-стиля-объединения → случай-перечисления-стиля-объединения | случай-перечисления-стиля-объединения , список-случаев-перечисления-стиля-объединения
случай-перечисления-стиля-объединения → имя-случая-перечисления кортеж-тип_?_
имя-перечисления → идентификатор
имя-случая-перечисления → идентификатор

перечисление-стиля-сырого-значения → enum имя-перечисления оператор-параметров-обобщения_?_ оператор-наследования-типов оператор-where-обобщения_?_ { члены-перечисления-стиля-сырого-значения }
члены-перечисления-стиля-сырого-значения → член-перечисления-стиля-сырого-значения члены-перечисления-стиля-сырого-значения_?_
член-перечисления-стиля-сырого-значения → объявление | оператор-случая-перечисления-стиля-сырого-значения | управляющая-инструкция-компилятора
оператор-случая-перечисления-стиля-сырого-значения → атрибуты_?_ case список-случаев-перечисления-стиля-сырого-значения
список-случаев-перечисления-стиля-сырого-значения → случай-перечисления-стиля-сырого-значения | случай-перечисления-стиля-сырого-значения , список-случаев-перечисления-стиля-сырого-значения
случай-перечисления-стиля-сырого-значения → имя-случая-перечисления присваивание-сырого-значения_?_
присваивание-сырого-значения → = литерал-сырого-значения
литерал-сырого-значения → литерал-числа | литерал-статистической-строки | литерал-логического-значения

Грамматика объявления структуры:

объявление-структуры → атрибуты_?_ модификатор-уровня-доступа_?_ struct имя-структуры оператор-параметров-обобщения_?_ оператор-наследования-типов_?_ оператор-where-обобщения_?_ тело-структуры
имя-структуры → идентификатор
тело-структуры → { члены-структуры_?_ }

члены-структуры → член-структуры члены-структуры_?_
член-структуры → объявление | управляющая-инструкция-компилятора

Грамматика объявления класса:

объявление-класса → атрибуты_?_ модификатор-уровня-доступа_?_ final_?_ class имя-класса оператор-параметров-обобщения_?_ оператор-наследования-типов_?_ оператор-where-обобщения_?_ тело-класса
объявление-класса → атрибуты_?_ final модификатор-уровня-доступа_?_ class имя-класса оператор-параметров-обобщения_?_ оператор-наследования-типов_?_ оператор-where-обобщения_?_ тело-класса
имя-класса → идентификатор
тело-класса → { члены-класса_?_ }

члены-класса → член-класса члены-класса_?_
член-класса → объявление | управляющая-инструкция-компилятора

Грамматика объявления актора:

объявление-актора → атрибуты_?_ модификатор-уровня-доступа_?_ actor имя-актора оператор-параметров-обобщения_?_ оператор-наследования-типов_?_ оператор-where-обобщения_?_ тело-актора
имя-актора → идентификатор
тело-актора → { члены-актора_?_ }

члены-актора → член-актора члены-актора_?_
член-актора → объявление | управляющая-инструкция-компилятора

Грамматика объявления протокола:

protocol-declaration → attributes_?_ access-level-modifier_?_ protocol protocol-name type-inheritance-clause_?_ generic-where-clause_?_ protocol-body
protocol-name → identifier
protocol-body → { protocol-members_?_ }

protocol-members → protocol-member protocol-members_?_
protocol-member → protocol-member-declaration | compiler-control-statement

protocol-member-declaration → protocol-property-declaration
protocol-member-declaration → protocol-method-declaration
protocol-member-declaration → protocol-initializer-declaration
protocol-member-declaration → protocol-subscript-declaration
protocol-member-declaration → protocol-associated-type-declaration
protocol-member-declaration → typealias-declaration

Грамматика объявления свойства протокола:

protocol-property-declaration → variable-declaration-head variable-name type-annotation getter-setter-keyword-block

Грамматика объявления метода протокола:

protocol-method-declaration → function-head function-name generic-parameter-clause_?_ function-signature generic-where-clause_?_

Грамматика объявления инициализатора протокола:

protocol-initializer-declaration → initializer-head generic-parameter-clause_?_ parameter-clause throws-clause_?_ generic-where-clause_?_
protocol-initializer-declaration → initializer-head generic-parameter-clause_?_ parameter-clause rethrows generic-where-clause_?_

Грамматика объявления подстроки протокола:

protocol-subscript-declaration → subscript-head subscript-result generic-where-clause_?_ getter-setter-keyword-block

Грамматика объявления ассоциированного типа протокола:

protocol-associated-type-declaration → attributes_?_ access-level-modifier_?_ associatedtype typealias-name type-inheritance-clause_?_ typealias-assignment_?_ generic-where-clause_?_

Грамматика объявления инициализатора:

initializer-declaration → initializer-head generic-parameter-clause_?_ parameter-clause async_?_ throws-clause_?_ generic-where-clause_?_ initializer-body
initializer-declaration → initializer-head generic-parameter-clause_?_ parameter-clause async_?_ rethrows generic-where-clause_?_ initializer-body
initializer-head → attributes_?_ declaration-modifiers_?_ init
initializer-head → attributes_?_ declaration-modifiers_?_ init ?
initializer-head → attributes_?_ declaration-modifiers_?_ init !
initializer-body → code-block

Грамматика объявления деинициализатора:

deinitializer-declaration → attributes_?_ deinit code-block

Грамматика объявления расширения:

extension-declaration → attributes_?_ access-level-modifier_?_ extension type-identifier type-inheritance-clause_?_ generic-where-clause_?_ extension-body
extension-body → { extension-members_?_ }

extension-members → extension-member extension-members_?_
extension-member → declaration | compiler-control-statement

Грамматика объявления подстроки:

subscript-declaration → subscript-head subscript-result generic-where-clause_?_ code-block
subscript-declaration → subscript-head subscript-result generic-where-clause_?_ getter-setter-block
subscript-declaration → subscript-head subscript-result generic-where-clause_?_ getter-setter-keyword-block
subscript-head → attributes_?_ declaration-modifiers_?_ subscript generic-parameter-clause_?_ parameter-clause
subscript-result → -> attributes_?_ type

Грамматика объявления макроса:

macro-declaration → macro-head identifier generic-parameter-clause_?_ macro-signature macro-definition_?_ generic-where-clause
macro-head → attributes_?_ declaration-modifiers_?_ macro
macro-signature → parameter-clause macro-function-signature-result_?_
macro-function-signature-result → -> type
macro-definition → = expression

Грамматика объявления оператора:

operator-declaration → prefix-operator-declaration | postfix-operator-declaration | infix-operator-declaration

prefix-operator-declaration → prefix operator operator
postfix-operator-declaration → postfix operator operator
infix-operator-declaration → infix operator operator infix-operator-group_?_

infix-operator-group → : precedence-group-name

Грамматика объявления группы приоритетов:

precedence-group-declaration → precedencegroup precedence-group-name { precedence-group-attributes_?_ }

precedence-group-attributes → precedence-group-attribute precedence-group-attributes_?_
precedence-group-attribute → precedence-group-relation
precedence-group-attribute → precedence-group-assignment
precedence-group-attribute → precedence-group-associativity

precedence-group-relation → higherThan : precedence-group-names
precedence-group-relation → lowerThan : precedence-group-names

precedence-group-assignment → assignment : boolean-literal

precedence-group-associativity → associativity : left
precedence-group-associativity → associativity : right
precedence-group-associativity → associativity : none

precedence-group-names → precedence-group-name | precedence-group-name , precedence-group-names
precedence-group-name → identifier

Грамматика модификатора объявления:

declaration-modifier → class | convenience | dynamic | final | infix | lazy | optional | override | postfix | prefix | required | static | unowned | unowned ( safe ) | unowned ( unsafe ) | weak
declaration-modifier → access-level-modifier
declaration-modifier → mutation-modifier
declaration-modifier → actor-isolation-modifier
declaration-modifiers → declaration-modifier declaration-modifiers_?_

access-level-modifier → private | private ( set )
access-level-modifier → fileprivate | fileprivate ( set )
access-level-modifier → internal | internal ( set )
access-level-modifier → package | package ( set )
access-level-modifier → public | public ( set )
access-level-modifier → open | open ( set )

mutation-modifier → mutating | nonmutating

actor-isolation-modifier → nonisolated

Атрибуты

Грамматика атрибута:

attribute → @ attribute-name attribute-argument-clause_?_
attribute-name → identifier
attribute-argument-clause → ( balanced-tokens_?_ )
attributes → attribute attributes_?_

balanced-tokens → balanced-token balanced-tokens_?_
balanced-token → ( balanced-tokens_?_ )
balanced-token → [ balanced-tokens_?_ ]
balanced-token → { balanced-tokens_?_ }
balanced-token → Любой идентификатор, ключевое слово, литерал или оператор
balanced-token → Любая пунктуация, кроме (, ), [, ], { или }

Шаблоны

Грамматика шаблона:

pattern → wildcard-pattern type-annotation_?_
pattern → identifier-pattern type-annotation_?_
pattern → value-binding-pattern
pattern → tuple-pattern type-annotation_?_
pattern → enum-case-pattern
pattern → optional-pattern
pattern → type-casting-pattern
pattern → expression-pattern

Грамматика шаблона подстановки:

wildcard-pattern → _

Грамматика шаблона идентификатора:

identifier-pattern → identifier

Грамматика шаблона привязки значения:

value-binding-pattern → var pattern | let pattern

Грамматика шаблона кортежа:

tuple-pattern → ( tuple-pattern-element-list_?_ )
tuple-pattern-element-list → tuple-pattern-element | tuple-pattern-element , tuple-pattern-element-list
tuple-pattern-element → pattern | identifier : pattern

Грамматика шаблона случая перечисления:

enum-case-pattern → type-identifier_?_ . enum-case-name tuple-pattern_?_

Грамматика шаблона необязательности:

optional-pattern → identifier-pattern ?

Грамматика шаблона приведения типа:

type-casting-pattern → is-pattern | as-pattern
is-pattern → is type
as-pattern → pattern as type

Грамматика шаблона выражения:

expression-pattern → expression

Параметры и аргументы дженериков

Грамматика пункта параметров дженериков:

generic-parameter-clause → < generic-parameter-list >
generic-parameter-list → generic-parameter | generic-parameter , generic-parameter-list
generic-parameter → type-name
generic-parameter → type-name : type-identifier
generic-parameter → type-name : protocol-composition-type

generic-where-clause → where requirement-list
requirement-list → requirement | requirement , requirement-list
requirement → conformance-requirement | same-type-requirement

conformance-requirement → type-identifier : type-identifier
conformance-requirement → type-identifier : protocol-composition-type
same-type-requirement → type-identifier == type

Грамматика пункта аргументов дженериков:

generic-argument-clause → < generic-argument-list >
generic-argument-list → generic-argument | generic-argument , generic-argument-list
generic-argument → type

This source file is part of the Swift.org open source project
Copyright © 2014 - 2025 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API