Сводка грамматики
Прочитайте всю формальную грамматику.
Лексическая структура
Грамматика пробелов:
пробел → элемент-пробела пробел_?_
элемент-пробела → перевод-строки
элемент-пробела → внутристрочный-пробел
элемент-пробела → комментарий
элемент-пробела → многострочный-комментарий
элемент-пробела → 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-charactersoperator-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+3030operator-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_?_->typefunction-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 → identifierthrows-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 →
sometype
Грамматика типа протокола в ящике:
boxed-protocol-type →
anytype
Грамматика типа метатипа:
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 →
istype
type-casting-operator →astype
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-literalarray-literal →
[array-literal-items_?_]
array-literal-items → array-literal-item,_?_ | array-literal-item,array-literal-items
array-literal-item → expressiondictionary-literal →
[dictionary-literal-items]|[:]
dictionary-literal-items → dictionary-literal-item,_?_ | dictionary-literal-item,dictionary-literal-items
dictionary-literal-item → expression:expressionplayground-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-expressionself-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 →
ifcondition-list{statement}if-expression-tail
if-expression-tail →elseif-expression
if-expression-tail →else{statement}switch-expression →
switchexpression{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-listinclosure-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 → identifiercapture-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_?_
END_OF_DOCUMENT_MARKERГрамматика выражения пути ключа:
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-postfixeskey-path-postfixes → key-path-postfix key-path-postfixes_?_
key-path-postfix →?|!|self|[function-call-argument-list]
Грамматика выражения селектора:
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-closuresfunction-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:operatortrailing-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-blockargument-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 →
forcase_?_ patterninexpression where-clause_?_ code-block
Грамматика оператора while:
while-statement →
whilecondition-list code-blockcondition-list → condition | condition
,condition-list
condition → expression | availability-condition | case-condition | optional-binding-conditioncase-condition →
casepattern initializer
optional-binding-condition →letpattern initializer_?_ |varpattern initializer_?_
Грамматика оператора repeat-while:
repeat-while-statement →
repeatcode-blockwhileexpression
Грамматика оператора ветвления:
branch-statement → if-statement
branch-statement → guard-statement
branch-statement → switch-statement
Грамматика оператора if:
if-statement →
ifcondition-list code-block else-clause_?_
else-clause →elsecode-block |elseif-statement
Грамматика оператора guard:
guard-statement →
guardcondition-listelsecode-block
Грамматика оператора switch:
switch-statement →
switchexpression{switch-cases_?_}
switch-cases → switch-case switch-cases_?_
switch-case → case-label statements
switch-case → default-label statements
switch-case → conditional-switch-casecase-label → attributes_?_
casecase-item-list:
case-item-list → pattern where-clause_?_ | pattern where-clause_?_,case-item-list
default-label → attributes_?_default:where-clause →
wherewhere-expression
where-expression → expressionconditional-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-statementstatement-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 →
breaklabel-name_?_
Грамматика оператора continue:
continue-statement →
continuelabel-name_?_
Грамматика оператора fallthrough:
fallthrough-statement →
fallthrough
Грамматика оператора return:
return-statement →
returnexpression_?_
Грамматика оператора throw:
throw-statement →
throwexpression
Грамматика оператора defer:
defer-statement →
defercode-block
Грамматика оператора do:
do-statement →
dothrows-clause_?_ code-block catch-clauses_?_
catch-clauses → catch-clause catch-clauses_?_
catch-clause →catchcatch-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 →#endifcompilation-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-conditionplatform-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_?_
importimport-kind_?_ import-pathimport-kind →
typealias|struct|class|enum|protocol|let|var|func
import-path → identifier | identifier.import-path
Грамматика объявления константы:
constant-declaration → attributes_?_ declaration-modifiers_?_
letpattern-initializer-listpattern-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_?_
protocolprotocol-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-statementprotocol-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-clauserethrowsgeneric-where-clause_?_
Грамматика объявления подстроки протокола:
protocol-subscript-declaration → subscript-head subscript-result generic-where-clause_?_ getter-setter-keyword-block
Грамматика объявления ассоциированного типа протокола:
protocol-associated-type-declaration → attributes_?_ access-level-modifier_?_
associatedtypetypealias-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-clauseasync_?_rethrowsgeneric-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_?_
deinitcode-block
Грамматика объявления расширения:
extension-declaration → attributes_?_ access-level-modifier_?_
extensiontype-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_?_subscriptgeneric-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 →
prefixoperatoroperator
postfix-operator-declaration →postfixoperatoroperator
infix-operator-declaration →infixoperatoroperator infix-operator-group_?_infix-operator-group →
:precedence-group-name
Грамматика объявления группы приоритетов:
precedence-group-declaration →
precedencegroupprecedence-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-associativityprecedence-group-relation →
higherThan:precedence-group-names
precedence-group-relation →lowerThan:precedence-group-namesprecedence-group-assignment →
assignment:boolean-literalprecedence-group-associativity →
associativity:left
precedence-group-associativity →associativity:right
precedence-group-associativity →associativity:noneprecedence-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|nonmutatingactor-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 →
varpattern |letpattern
Грамматика шаблона кортежа:
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 →istype
as-pattern → patternastype
Грамматика шаблона выражения:
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-typegeneric-where-clause →
whererequirement-list
requirement-list → requirement | requirement,requirement-list
requirement → conformance-requirement | same-type-requirementconformance-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