Как долго поддерживается конкатенация NSString?

Я только что встретил эту строку в некотором устаревшем коде, который редактирую:

[UIImage imageNamed:@"data/visuals/interface/" @"backgroundViewController"];
                                             ^^^^
                                   "Oops, what have I done here?"

Я думал, что, должно быть, случайно случайно вставил что-то не в то место, но отмена не изменила эту линию. Из любопытства я построил программу, и она прошла успешно!

Whaddyaknow? Obj-c имеет более сжатый способ конкатенации строковых литералов.

Я добавил еще несколько тестов:

Простой журнал

NSLog(@"data/visuals/interface/" @"backgroundViewController");

Данные/визуальные/интерфейс/backgroundViewController

В параметрах

NSURL *url = [NSURL URLWithString:@"http://" @"test.com" @"/path"];
NSLog(@"URL:%@", url);

URL: HTTP://test.com/path

Использование переменных

NSString *s = @"string1";
NSString *s2 = @"string2";

NSLog(@"%@", s s2);

Не компилируется (не удивляется этому)

Другие литералы

NSNumber *number = @1 @2;

Не компилирует


Некоторые вопросы

  • Является ли это конкатенация строк документированной где угодно?
  • Как долго он поддерживается?
  • Какова основная реализация? Я ожидаю, что это будет [s1 stringByAppendingString:s2]
  • Считается ли это хорошей практикой каким-либо авторитетным органом?

Ответ 1

Этот метод объединения static NSStrings - это компилятор времени компиляции, который доступен уже более десяти лет. Он обычно используется, чтобы позволить длинные постоянные строки разбиваться на несколько строк. Подобные возможности были доступны в "С" на протяжении десятилетий.

В книге C Programming Language, второе издание 1988 г., на стр. 38 описывается конкатенация строк, поэтому она существует уже долгое время.

Выдержка из книги:

Строковые константы могут быть объединены во время компиляции:

"hello," " world" is equivalent to "hello, world"

Это полезно для выплескивания длинных строк по нескольким исходным строкам.

Objective-C является строгим надмножеством "C", поэтому он всегда поддерживал конкатенацию "C", и я предполагаю, что из-за этого статическая конкатенация NSString всегда была доступна.

Это считается хорошей практикой, когда используется для разделения статической строки на несколько строк для удобства чтения.