Лексическая структура
Лексическая структура Свифта описывает, какая последовательность символов формируют допустимые маркеры языка. Эти допустимые маркеры формируют стандартные блоки самого низкого уровня языка и используются для описания остальной части языка в последующих главах. Маркер состоит из идентификатора, ключевого слова, пунктуации, литерала или оператора.
В большинстве случаев маркеры сгенерированы от символов исходного файла Swift путем рассмотрения самой длинной подстроки из входного текста в ограничениях грамматики, указанных ниже. Это поведение упоминается, поскольку жует самое долгое соответствие или максимальный.
Пробел и комментарии
Пробел имеет два использования: разделить маркеры в исходном файле и помочь определить, является ли оператор префиксом или постфиксом (см. Операторов), но иначе проигнорированы. Следующие символы считают пробелом: пространство (U+0020), перевод строки (U+000A), возврат каретки (U+000D), горизонтальная вкладка (U+0009), вертикальная вкладка (U+000B), перевод формата (U+000C) и нуль (U+0000).
Комментарии обрабатываются как пробел компилятором. Однострочные комментарии начинаются //
и продолжайте до перевода строки (U+000A) или возврат каретки (U+000D). Многострочные комментарии начинаются /*
и конец с */
. Вложенные многострочные комментарии позволяются, но должны быть сбалансированы маркеры комментария.
Идентификаторы
Идентификаторы начинаются с прописной буквы или строчной буквы A через Z, подчеркивание (_
), необъединяющийся алфавитно-цифровой символ Unicode в Основной Многоязычной Плоскости или символ вне Основной Многоязычной Плоскости, которая не находится в области Личного пользования. После первого символа также позволяются цифры и объединяющиеся символы Unicode.
Для использования зарезервированного слова в качестве идентификатора поместите обратную галочку (`
) прежде и после него. Например, class
не допустимый идентификатор, но `class`
допустимо. Обратные галочки не считают частью идентификатора; `x`
и x
имейте то же значение.
В закрытии без явных названий параметра неявно называют параметры $0
, $1
, $2
, и т.д. Эти имена являются допустимыми идентификаторами в рамках закрытия.
Грамматика идентификатора
идентификатор → «символы идентификатора головы идентификатора выбирает»
идентификатор
→ `
«символы идентификатора головы идентификатора выбирают»`
идентификатор → неявное название параметра -
список идентификаторов
→
идентификатор -
идентификатор -,
список идентификатора -
голова идентификатора → Верхний - или строчная буква 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
символ идентификатора → Цифра 0 до 9
символ идентификатора → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, или U+FE20–U+FE2F
символ идентификатора → голова идентификатора -
символы идентификатора → «символы идентификатора символа идентификатора выбирают»
неявное название параметра
→ $
десятичные цифры -
Ключевые слова и пунктуация
Следующие ключевые слова резервируются и не могут использоваться в качестве идентификаторов, если их не оставляют с обратными галочками, как описано выше в Идентификаторах.
Ключевые слова использовали в объявлениях:
class
,deinit
,enum
,extension
,func
,import
,init
,internal
,let
,operator
,private
,protocol
,public
,static
,struct
,subscript
,typealias
, иvar
.Ключевые слова использовали в операторах:
break
,case
,continue
,default
,do
,else
,fallthrough
,for
,if
,in
,return
,switch
,where
, иwhile
.Ключевые слова, используемые в выражениях и типах:
as
,dynamicType
,false
,is
,nil
,self
,Self
,super
,true
,__COLUMN__
,__FILE__
,__FUNCTION__
, и__LINE__
.
Ключевые слова зарезервировали в определенных контекстах:
associativity
,convenience
,dynamic
,didSet
,final
,get
,infix
,inout
,lazy
,left
,mutating
,none
,nonmutating
,optional
,override
,postfix
,precedence
,prefix
,Protocol
,required
,right
,set
,Type
,unowned
,weak
, иwillSet
. Вне контекста, в котором они появляются в грамматике, они могут использоваться в качестве идентификаторов.
Следующие маркеры резервируются как пунктуация и не могут использоваться в качестве пользовательских операторов: (
, )
, {
, }
, [
, ]
, .
, ,
, :
, ;
, =
, @
, #
, &
(как префиксный оператор), ->
, `
, ?
, и !
(как постфиксный оператор).
Литералы
Литерал является представлением исходного кода значения типа, такого как число или строка.
Следующее является примерами литералов:
42 // Integer literal
3.14159 // Floating-point literal
"Hello, world!" // String literal
true // Boolean literal
Литерал не имеет типа самостоятельно. Вместо этого литерал анализируется как наличие бесконечной точности, и вывод типа Swift пытается вывести тип для литерала. Например, в объявлении let x: Int8 = 42
, Swift использует явную аннотацию типа (: Int8
) вывести что тип целочисленного литерала 42
Int8
. Если нет подходящей доступной информации о типе, Swift выводит, что тип литерала является одним из литеральных типов по умолчанию, определенных в библиотеке стандарта Swift. Типы по умолчанию Int
для целочисленных литералов, Double
для литералов с плавающей точкой, String
для строковых литералов, и Bool
для булевых литералов. Например, в объявлении let str = "Hello, world"
, значение по умолчанию вывело тип строкового литерала "Hello, world"
String
.
При указании аннотации типа для литерального значения тип аннотации должен быть типом, который можно инстанцировать от того литерального значения. Т.е. тип должен соответствовать одному из следующих протоколов библиотеки стандарта Swift: IntegerLiteralConvertible
для целочисленных литералов, FloatingPointLiteralConvertible
для литералов с плавающей точкой, StringLiteralConvertible
для строковых литералов, и BooleanLiteralConvertible
для булевых литералов. Например, Int8
соответствует IntegerLiteralConvertible
протокол, и поэтому это может использоваться в аннотации типа для целочисленного литерала 42
в объявлении let x: Int8 = 42
.
Грамматика литерала
литерал → числовой литерал - строковый литерал - булев литерал - нулевой литерал -
числовой литерал
→
-
«выберите целочисленный литерал»
-
«выберите литерал с плавающей точкой»
Целочисленные литералы
Целочисленные литералы представляют целочисленные значения неуказанной точности. По умолчанию целочисленные литералы выражены в десятичном числе; можно указать альтернативную основу с помощью префикса. Двоичные литералы начинаются 0b
, восьмеричные литералы начинаются 0o
, и шестнадцатеричные литералы начинаются 0x
.
Десятичные литералы содержат цифры 0
через 9
. Двоичные литералы содержат 0
и 1
, восьмеричные литералы содержат 0
через 7
, и шестнадцатеричные литералы содержат 0
через 9
а также A
через F
в верхнем - или нижний регистр.
Отрицательные целочисленные литералы выражены путем предварительного ожидания знака «минус» (-
) к целочисленному литералу, как в -42
.
Подчеркивания (_
) позволяются между цифрами для удобочитаемости, но они проигнорированы и поэтому не влияют на значение литерала. Целочисленные литералы могут начаться с начальных нулей (0
), но они аналогично проигнорированы и не влияют на основу или значение литерала.
Если не указано иное выведенный тип значения по умолчанию целочисленного литерала является типом библиотеки стандарта Swift Int
. Библиотека стандарта Swift также определяет типы для различных размеров целых чисел со знаком и целых без знака, как описано в Целых числах.
Грамматика целочисленного литерала
целочисленный литерал → двоичный литерал -
целочисленный литерал → восьмеричный литерал -
целочисленный литерал → десятичный литерал -
целочисленный литерал → шестнадцатеричный литерал -
двоичный литерал
→ 0b
«двоичные буквенные символы двоичной цифры выбирают»
двоичная цифра → Цифра 0 или 1
двоичный буквенный символ
→
двоично-разрядный -
_
двоичные буквенные символы → «двоичные двоичные буквенные символы буквенного символа выбирают»
восьмеричный литерал
→ 0o
«восьмеричная цифра восьмеричные буквенные символы выбирает»
восьмерично-разрядная → Цифра 0 до 7
восьмеричный буквенный символ
→
восьмерично-разрядный -
_
восьмеричные буквенные символы → «восьмеричный буквенный символ восьмеричные буквенные символы выбирают»
десятичный литерал → «буквенные символы десятичного числа десятичной цифры выбирает»
десятичная цифра → Цифра 0 до 9
десятичные цифры → «десятичные цифры десятичной цифры выбирают»
десятичный буквенный символ
→
десятично-разрядный -
_
десятичные буквенные символы → «десятичные буквенные символы десятичного числа буквенного символа выбирают»
шестнадцатеричный литерал
→ 0x
«шестнадцатеричная цифра шестнадцатеричные буквенные символы выбирает»
шестнадцатерично-разрядная → Цифра 0 до 9, через f, или через F
шестнадцатеричный буквенный символ
→
шестнадцатерично-разрядный -
_
шестнадцатеричные буквенные символы → «шестнадцатеричный буквенный символ шестнадцатеричные буквенные символы выбирают»
Литералы с плавающей точкой
Литералы с плавающей точкой представляют значения с плавающей точкой неуказанной точности.
По умолчанию литералы с плавающей точкой выражены в десятичном числе (без префикса), но они могут также быть выражены в шестнадцатеричном (с a 0x
префикс).
Десятичные литералы с плавающей точкой состоят из последовательности десятичных цифр, сопровождаемых или десятичной дробью, десятичной экспонентой или обоими. Десятичная дробь состоит из десятичной точки (.
) сопровождаемый последовательностью десятичных цифр. Экспонента состоит из верхнего - или нижний регистр e
префикс, сопровождаемый последовательностью десятичных цифр, указывающей что питание 10 значение, предшествующее e
умножается на. Например, 1.25e2
представляет 1,25 × 102, оценивающие к 125.0
. Точно так же 1.25e-2
представляет 1,25 × 10-2, который оценивает к 0.0125
.
Шестнадцатеричные литералы с плавающей точкой состоят из a 0x
префикс, сопровождаемый дополнительной шестнадцатеричной частью, сопровождаемой шестнадцатеричной экспонентой. Шестнадцатеричная часть состоит из десятичной точки, сопровождаемой последовательностью шестнадцатеричных цифр. Экспонента состоит из верхнего - или нижний регистр p
префикс, сопровождаемый последовательностью десятичных цифр, указывающей что питание 2 значение, предшествующее p
умножается на. Например, 0xFp2
представляет 15 × 22, оценивающих к 60
. Точно так же 0xFp-2
представляет 15 × 2-2, который оценивает к 3.75
.
Отрицательные литералы с плавающей точкой выражены путем предварительного ожидания знака «минус» (-
) к литералу с плавающей точкой, как в -42.5
.
Подчеркивания (_
) позволяются между цифрами для удобочитаемости, но проигнорированы и поэтому не влияют на значение литерала. Литералы с плавающей точкой могут начаться с начальных нулей (0
), но аналогично проигнорированы и не влияют на основу или значение литерала.
Если не указано иное выведенный тип значения по умолчанию литерала с плавающей точкой является типом библиотеки стандарта Swift Double
, который представляет 64-разрядное число с плавающей точкой. Библиотека стандарта Swift также определяет a Float
введите, который представляет 32-разрядное число с плавающей точкой.
Грамматика литерала с плавающей точкой
литерал с плавающей точкой → «десятичная литеральная десятичная дробь выбирает, десятичная экспонента выбирает»
литерал с плавающей точкой → «шестнадцатеричная литеральная шестнадцатеричная часть выбирает шестнадцатеричная экспонента»
десятичная дробь
→ .
десятичный литерал -
десятичная экспонента → floating-point-e-sign-opt-decimal-literal-
шестнадцатеричная часть
→ .
«шестнадцатеричная цифра шестнадцатеричные буквенные символы выбирает»
шестнадцатеричная экспонента → floating-point-p-sign-opt-decimal-literal-
Строковые литералы
Строковый литерал является последовательностью символов, окруженных двойными кавычками со следующей формой:
"characters"
Строковые литералы не могут содержать незавершенную двойную кавычку ("
), незавершенная наклонная черта влево (\
), возврат каретки или перевод строки.
Специальные символы могут быть включены в строковые литералы с помощью следующих escape-последовательностей:
Нулевой символ (
\0
)Наклонная черта влево (
\\
)Горизонтальная вкладка (
\t
)Перевод строки (
\n
)Возврат каретки (
\r
)Двойная кавычка (
\"
)Одинарная кавычка (
\'
)Скаляр Unicode (
\u{
n}
), где n между одной и восемью шестнадцатеричными цифрами
Значение выражения может быть вставлено в строковый литерал путем размещения выражения в круглых скобках после наклонной черты влево (\
). Интерполированное выражение не должно содержать незавершенную двойную кавычку ("
), незавершенная наклонная черта влево (\
), возврат каретки или перевод строки. Выражение должно оценить к значению типа что String
класс имеет инициализатор для.
Например, все следующие строковые литералы имеют то же значение:
"1 2 3"
"1 2 \(3)"
"1 2 \(1 + 2)"
let x = 3; "1 2 \(x)"
Выведенный тип значения по умолчанию строкового литерала String
. Значение по умолчанию вывело тип символов, составляющих строку, Character
. Для получения дополнительной информации о String
и Character
типы, посмотрите Строки и Символы.
Грамматика строкового литерала
строковый литерал
→ "
«заключенный в кавычки текст выбирает»"
заключенный в кавычки текст → «заключенный в кавычки текст элемента заключенного в кавычки текста выбирает»
«заключенный в кавычки текстовый элемент » → завершенный символ -
«заключенный в кавычки текстовый элемент
» → \(
выражение -)
«заключенный в кавычки текстовый элемент
» → Любое скалярное значение Unicode кроме "
, \
, U+000A или U+000D
завершенный символ
→
\0
\\
\t
\n
\r
\"
\'
завершенный символ
→ \u
{
unicode-scalar-digits-}
unicode-scalar-digits → Между одной и восемью шестнадцатеричными цифрами
Операторы
Библиотека стандарта Swift определяет много операторов для Вашего использования, многие из которых обсуждены в Основных Операторах и Усовершенствованных Операторах. Существующий раздел описывает, какие символы могут использоваться для определения пользовательских операторов.
Пользовательские операторы могут начаться с одного из символов ASCII /
, =
, -
, +
, !
, *
, %
, <
, >
, &
, |
, ^
, ?
, или ~
, или один из символов Unicode определил в грамматике ниже (которые включают символы от Математических операторов, Разных Символов и блоков Unicode Графических меток, среди других). После первого символа также позволяются объединяющиеся символы Unicode. Можно также определить пользовательские операторы как последовательность двух или больше точек (например, ....
). Несмотря на то, что можно определить пользовательские операторы, содержащие символ вопросительного знака (?
), они не могут состоять из единственного символа вопросительного знака только.
Пробел вокруг оператора используется, чтобы определить, используется ли оператор в качестве префиксного оператора, постфиксного оператора или бинарного оператора. Это поведение получено в итоге в соблюдающих правилах:
Если у оператора есть пробел вокруг обеих сторон или вокруг никакой стороны, он обрабатывается как бинарный оператор. Как пример,
+
оператор вa+b
иa + b
обрабатывается как бинарный оператор.Если у оператора есть пробел на левой стороне только, это обрабатывается как префиксный унарный оператор. Как пример,
++
оператор вa ++b
обрабатывается как префиксный унарный оператор.Если у оператора есть пробел на правой стороне только, это обрабатывается как постфиксный унарный оператор. Как пример,
++
оператор вa++ b
обрабатывается как постфиксный унарный оператор.Если оператор не имеет никакого пробела слева, но сразу сопровождается точкой (
.
), это обрабатывается как постфиксный унарный оператор. Как пример,++
оператор вa++.b
обрабатывается как постфиксный унарный оператор (a++ .b
вместоa ++ .b
).
В целях этих правил, символов (
, [
, и {
перед оператором, символами )
, ]
, и }
после оператора и символов ,
, ;
, и :
также считаются пробелом.
Существует один протест к правилам выше. Если !
или ?
у предопределенного оператора нет пробела слева, это обрабатывается как постфиксный оператор, независимо от того, имеет ли это пробел справа. Использовать ?
как дополнительно объединяющий в цепочку оператор, это не должно иметь пробела слева. Использовать его в троичном условном выражении (?
:
) оператор, это должно иметь пробел вокруг обеих сторон.
В определенных конструкциях, операторах с продвижением <
или >
может быть разделен на два или больше маркера. Остаток обрабатывается тот же путь и может быть разделен снова. В результате нет никакой потребности использовать пробел для устранения неоднозначности между закрытием >
символы в конструкциях как Dictionary<String, Array<Int>>
. В этом примере, закрытии >
символы не обрабатываются как единственный маркер, который может тогда быть неправильно истолкован как маленький сдвиг >>
оператор.
Чтобы изучить, как определить новые, пользовательские операторы, посмотрите Объявление Оператора и Пользовательские операторы. Чтобы изучить, как перегрузить существующих операторов, посмотрите Функции Оператора.
Грамматика операторов
оператор → «оператор возглавляет, символы оператора выбирают»
оператор → «отмечает точкой символы оператора точки головы оператора, выбирают»
голова оператора
→
/
=
-
+
!
*
%
<
>
&
|
^
~
?
голова оператора → U+00A1–U+00A7
главный оператором → U+00A9 или U+00AB
голова оператора → U+00AC или U+00AE
голова оператора → U+00B0–U+00B1, U+00B6, U+00BB, U+00BF, U+00D7 или U+00F7
голова оператора → U+2016–U+2017 или U+2020–U+2027
голова оператора → U+2030–U+203E
голова оператора → U+2041–U+2053
голова оператора → U+2055–U+205E
голова оператора → U+2190–U+23FF
голова оператора → U+2500–U+2775
голова оператора → U+2794–U+2BFF
голова оператора → U+2E00–U+2E7F
символ оператора → голова оператора -
символ оператора → U+0300–U+036F
символ оператора → U+1DC0–U+1DFF
символ оператора → U+20D0–U+20FF
символ оператора → U+FE00–U+FE0F
символ оператора → U+FE20–U+FE2F
символ оператора → U+E0100–U+E01EF
символы оператора → «символы оператора символа оператора выбирают»
точечная голова оператора
→ ..
точечный символ оператора
→
.
символ оператора -
точечные символы оператора → «отмечают точкой символы оператора точки символа оператора, выбирают»