Почему экземпляры создаются с использованием "буквального синтаксиса", известного как "литералы"?

Меня беспокоит то, что термин "литерал" используется для обозначения экземпляров таких классов, как NSString а также NSArray, Я видел только термин, используемый в отношении NSString и будучи наивным, я думал, что это как-то связано с тем, что "буквально" это строка, то есть между кавычками. Извините, если это звучит жалко, но я так об этом думал.

Тогда сегодня я узнал, что определенные случаи NSArray также может называться буквальными экземплярами, то есть экземпляром класса, созданным с использованием "буквального синтаксиса".

3 ответа

Решение

Как отмечает @Linuxios, буквальные синтаксисы встроены в язык. Хотя они шире, чем вы думаете. Литерал просто означает, что фактическое значение закодировано в источнике. Так что в ObjC довольно много буквальных синтаксисов. Например:

  • 1 - инт
  • 1.0 - двойной
  • 1.0f - плавать
  • "a" - C-струна
  • @"a" - NSString
  • @[] - NSArray
  • ^{} - функция

Да, блоки - это просто функциональные литералы. Это анонимное значение, которое присваивается имени символа (например, переменной или константе).

Вообще говоря, литералы могут храниться в текстовом сегменте и вычисляться во время компиляции (а не во время выполнения). Если я правильно помню, литералы массива в настоящее время разворачиваются в эквивалентный код и оцениваются во время выполнения, но @"..." строковые литералы кодируются в двоичном виде как статические данные (по крайней мере, теперь они являются; версии Apple, не относящиеся к Apple, используются для кодирования фактического вызова функции для создания статических строк, насколько я помню).

Литеральный синтаксис или литерал - это просто объект, который был создан с использованием выделенного синтаксиса, встроенного в язык, вместо использования обычного синтаксиса для создания объекта (что бы это ни было).

Здесь я создаю буквенный массив:

NSArray* a = @[@"Hello", @"World"];

Что для всех намерений и целей эквивалентно этому:

NSArray* a = [NSArray arrayWithObjects:@"Hello", @"World", nil];

Первый называется буквальным, потому что @[] синтаксис встроен в язык для создания массивов, так же, как @"..." синтаксис встроен для создания NSStrings.

термин "литерал" используется для обозначения экземпляров классов

Это не относится к случаю на самом деле; после создания объекта способ его создания не имеет значения:

NSArray * thisWasCreatedWithALiteral = @[@1, @2];
NSArray * butWhoCares = thisWasCreatedWithALiteral;

"Литеральная" часть - это просто специальный синтаксис @[@1, @2], а также

это как-то связано с тем, что оно "буквально" является строкой, то есть между кавычками.

совершенно верно: это выписанное представление массива, а не созданное с помощью метода конструктора, такого как arrayWithObjects:

Другие вопросы по тегам