Почему экземпляры создаются с использованием "буквального синтаксиса", известного как "литералы"?
Меня беспокоит то, что термин "литерал" используется для обозначения экземпляров таких классов, как 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];
Первый называется буквальным, потому что @[]
синтаксис встроен в язык для создания массивов, так же, как @"..."
синтаксис встроен для создания NSString
s.
термин "литерал" используется для обозначения экземпляров классов
Это не относится к случаю на самом деле; после создания объекта способ его создания не имеет значения:
NSArray * thisWasCreatedWithALiteral = @[@1, @2];
NSArray * butWhoCares = thisWasCreatedWithALiteral;
"Литеральная" часть - это просто специальный синтаксис @[@1, @2]
, а также
это как-то связано с тем, что оно "буквально" является строкой, то есть между кавычками.
совершенно верно: это выписанное представление массива, а не созданное с помощью метода конструктора, такого как arrayWithObjects: