2015-02-04 3 views
2

Что-то, что меня беспокоит, поэтому термин «литерал» используется для обозначения экземпляров классов, таких как NSString и NSArray. Я только видел термин, используемый для ссылки на NSString, и, будучи наивным, я думал, что это как-то связано с тем, что буквально это строка, которая находится между метками котировки. Извините, если это звучит жалко, но именно так я и думал об этом.Почему экземпляры создаются с использованием «литерала синтаксиса», известного как «литералы»?

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

+3

literal = жестко закодирован в код во время компиляции. E. g .: '@ [@" foo ", @" bar "]' - литерал массива. Сравните это с тем, что вы получаете динамически, во время выполнения (например, результат разбора некоторого JSON и т. Д.) –

ответ

2

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

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

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

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

+0

Да, '@ [...]' is 'arrayWithObjects: count:', и именно по этой причине вы можете 'используйте литералы, отличные от 'NSString', на верхнем уровне файла. –

+0

Действительно? Блоки являются функциональными литералами? Я думал, что они принципиально отличаются на уровне языка, потому что функции C не являются закрытием любого рода. – Linuxios

+0

Функции C являются своего рода закрытием. Они закрывают текущую лексическую область, в которой они определены. Таким образом, переменная, определенная в текущем файле (но вне самой функции), будет закрыта, как в блоке. Блоки тесно связаны с функциями в C. Я думаю, что вы имеете в виду, что функции * указатели * не являются закрытием любого типа, и я согласен с этим. –

2

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

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

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

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

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

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

1

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

Это не относится к экземпляру действительно; после того, как объект создан, как он был создан не имеет значения:

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

«буквальная» часть только специальный синтаксис @[@1, @2] и

это га [s] что-то делать с буквой «буквально», это строка, которая находится между метками котировки.

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