Да, #file
и #line
являются буквальными выражениями , но ваша программа все еще плохо сформирована.
В справочнике по языку Swift говорится :
Литеральное выражение состоит из обычного литерала (например, строки или числа), литерала массива или словаря, литерала детской площадки или одного из следующих специальных литералов:
#file
- String - Имя файла, в котором он появляется.
#line
- Int - Номер строки, в которой он появляется.
[. ..]
Отметим также грамматику:
literal-expression → literal
literal-expression → array-literal | dictionary-literal | playground-literal
literal-expression → #file | #line | #column | #function | #dsohandle
Теперь давайте рассмотрим грамматику определяемого вами перечисления . Я включаю сюда только самые важные части, вы можете проверить полный вывод самостоятельно:
enum-declaration → attributes opt access-level-modifier opt raw-value-style-enum
[...]
raw-value-style-enum → enum enum-name generic-parameter-clause opt type-inheritance-clause generic-where-clause opt { raw-value-style-enum-members }
[...]
raw-value-assignment → = raw-value-literal
raw-value-literal → numeric-literal | static-string-literal | boolean-literal
Примечательно, что только numeri c -literal , * Допускаются 1037 * stati c -string-literal , boolean-literal . Если мы посмотрим на их определения, станет ясно, что эти #
литералы, таким образом, не соответствуют правилу raw-value-literal
:
numeric-literal → -opt integer-literal | -opt floating-point-literal
boolean-literal → true | false
static-string-literal → string-literal-opening-delimiter quoted-text opt string-literal-closing-delimiter
static-string-literal → multiline-string-literal-opening-delimiter multiline-quoted-text opt multiline-string-literal-closing-delimiter
Все соответствующие правила для полного определения stati c -string-literal - длинные, но все же тривиально увидеть, что stati c -string-literal не может быть выведен из #file
и не может включать интерполяцию. (Вот что делает его c.)
Итак, компилятор Swift действительно прав, отказываясь от вашей программы. Тем не менее, современный компилятор не должен просто взламывать sh незаконную программу, поэтому, возможно, стоит сообщить об этой проблеме.