Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека разработчика XCode

Разработчик

Swift язык программирования

iBook
На этой странице

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

Лексическая структура Свифта описывает, какая последовательность символов формируют допустимые маркеры языка. Эти допустимые маркеры формируют стандартные блоки самого низкого уровня языка и используются для описания остальной части языка в последующих главах. Маркер состоит из идентификатора, ключевого слова, пунктуации, литерала или оператора.

В большинстве случаев маркеры сгенерированы от символов исходного файла 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

голова идентификатора 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

символ идентификатора голова идентификатора -

символы идентификатора «символы идентификатора символа идентификатора выбирают»

неявное название параметра десятичные цифры -

Ключевые слова и пунктуация

Следующие ключевые слова резервируются и не могут использоваться в качестве идентификаторов, если их не оставляют с обратными галочками, как описано выше в Идентификаторах.

  • Ключевые слова использовали в объявлениях: 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.

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

числовой литерал «выберите целочисленный литерал» «выберите литерал с плавающей точкой»

булев литерал true­ false­

нулевой литерал nil­

Целочисленные литералы

Целочисленные литералы представляют целочисленные значения неуказанной точности. По умолчанию целочисленные литералы выражены в десятичном числе; можно указать альтернативную основу с помощью префикса. Двоичные литералы начинаются 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-

floating-point-e

floating-point-p

знак

Строковые литералы

Строковый литерал является последовательностью символов, окруженных двойными кавычками со следующей формой:

  • "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+3001–U+3003

голова оператора U+3008–U+3030

символ оператора голова оператора -

символ оператора U+0300–U+036F

символ оператора U+1DC0–U+1DFF

символ оператора U+20D0–U+20FF

символ оператора U+FE00–U+FE0F

символ оператора U+FE20–U+FE2F

символ оператора U+E0100–U+E01EF

символы оператора «символы оператора символа оператора выбирают»

точечная голова оператора ..­

точечный символ оператора символ оператора -

точечные символы оператора «отмечают точкой символы оператора точки символа оператора, выбирают»

бинарный оператор оператор -

префиксный оператор оператор -

постфиксный оператор оператор -