В моем коде Objective-C для моей рамки GPUImage у меня есть следующий макрос:
#define STRINGIZE(x) #x
#define STRINGIZE2(x) STRINGIZE(x)
#define SHADER_STRING(text) @ STRINGIZE2(text)
который позволяет мне встраивать многострочные вершинные и фрагментарные шейдеры как литералы NSString в мои подклассы пользовательского фильтра, например:
NSString *const kGPUImagePassthroughFragmentShaderString = SHADER_STRING
(
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
void main()
{
gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
}
);
GPUImage нуждается в этом, чтобы предоставить форматированные вершинные и фрагментарные шейдеры, которые включены в основной текст подклассов фильтра. Доставка их в виде отдельных файлов сделает фреймворк невозможным скомпилировать в статическую библиотеку. Используя этот макрос, я могу сделать эти шейдеры доступными для копирования и вставки между кодом фреймворка и внешними файлами шейдеров без смешной работы по переформатированию.
Swift устраняет макросы компилятора, и в документации говорится об этом:
Сложные макросы используются в C и Objective-C, но не имеют аналогов в Свифт. Сложные макросы - это макросы, которые не определяют константы, включая скобки, функциональные макросы. Вы используете сложные макросы в C и Objective-C, чтобы избежать ограничений проверки типов или избежать переименование большого количества кода шаблона. Однако макросы могут отладки и реорганизации. В Swift вы можете использовать функции и дженериков для достижения тех же результатов без каких-либо компромиссов. Поэтому сложные макросы, которые находятся в C и Objective-C источнике файлы не доступны для вашего кода Swift.
В строке "В Swift вы можете использовать функции и обобщения для достижения тех же результатов без каких-либо компромиссов", есть ли способ в Swift предоставить многострочные строковые литералы, не прибегая к последовательности операций конкатенации?