Основной синтаксис Objective C: "% @"? - PullRequest
5 голосов
/ 14 апреля 2010

Я работаю через подкасты Стэнфорда для iPhone и у меня есть несколько основных вопросов.

Первое: почему нет простого объединения строк? (или я просто скучаю по нему?)

Мне нужна была помощь с NSLog ниже, и я понятия не имею, что он в данный момент делает (часть% @). Вы просто заменяете их в тех местах, где вам нужно объединение, а затем разделяете значения запятыми в конце?

NSString *path = @"~";
NSString *absolutePath = [path stringByExpandingTildeInPath];

NSLog(@"My home folder is at '%@'", absolutePath);

тогда как с любым другим языком программирования я бы сделал это так:

NSLog(@"My home folder is at " + absolutePath);

Спасибо! (Кроме того, какие-нибудь хорошие руководства / ссылки для тех, кто знаком с синтаксисом стиля Java / C # / etc, переходят на Objective-C?)

Ответы [ 4 ]

13 голосов
/ 14 апреля 2010

%@ является заполнителем в строке формата для экземпляра NSString.

Когда вы делаете что-то вроде:

NSLog(@"My home folder is at '%@'", absolutePath);

Вы говорите NSLog заменить заполнитель %@ на строку с названием absolutePath.

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

NSString *absolutePath = @"/home/whatever";
NSLog(@"My home #%d folder is at '%@'", 5, absolutePath);

Напечатает:

Мой дом № 5 находится в / доме / что угодно

Простой способ объединения строк:

NSString *s1 = @"Hello, ";
NSString *s2 = @"world.";
NSString *s = [NSString stringWithFormat:@"%@%@", s1, s2];
// s will be "Hello, world."

Нельзя использовать знак + в качестве оператора объединения строк, поскольку в Objective-C нет перегрузки операторов.

Надеюсь, это поможет.

4 голосов
/ 14 апреля 2010

Это спецификатор формата строки . По сути, это позволяет вам указать заполнитель в строке и значения, которые должны быть вставлены в место заполнителя. Ссылка, на которую я ссылаюсь выше, перечисляет различные обозначения для заполнителей и конкретного формата каждого заполнителя.

Это похоже на метод C # String.Format:

NSLog(String.Format("My home folder is at '{0}'", absolutePath));
2 голосов
/ 14 апреля 2010

Вы можете использовать NSString + stringWithFormat для объединения:

NSString* a = // ...
NSString* b = // ...
NSString* a_concatenated_with_b = [NSString stringWithFormat:@"%@%@",a,b];

Причина "% @" заключается в том, что форматирование строк основано на синтаксисе строк printf и расширяет его. Эти функции принимают переменное число аргументов, и все, что начинается со знака процента (%), интерпретируется как заполнитель. Последующие символы определяют тип заполнителя. Стандартный printf не использует «% @», и поскольку «@» является символом, обычно используемым для вещей, которые Objective-C добавляет к языку C, имеет смысл, что «@» будет символизировать «объект Objective-C» .

Не существует автоматической конкатенации с использованием знака плюс (+), поскольку NSString * является типом указателя, а Objective-C является строгим надмножеством C, и, следовательно, добавление к объекту NSString * делает манипулирование указателем. Objective-C не имеет функции перегрузки операторов, как в языке C ++.

0 голосов
/ 14 апреля 2010

Кроме того, %@ довольно универсален, поскольку фактически вставляет результат метода описания аргумента в строку результата. Для NSString это значение строки, другие классы могут предоставить полезные переопределения. Например, аналогично toString в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...