Необычный stringWithFormat: аргумент

#ios #objective-c #nsstring #mapkit

#iOS #objective-c #nsstring #mapkit

Вопрос:

Прошу прощения, если это вопрос новичка.

Я следил за этим руководством по mapkit и наткнулся на эту строку кода

 NSString *json = [NSString stringWithFormat:formatString,
                      centerLocation.latitude,
                      centerLocation.longitude,
                      0.5 * METERS_PER_MILE];
 

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

Но когда я распечатываю FormatString и json, результат идентичен.

Я никогда раньше не видел, чтобы nsstrings использовались таким образом. Есть ли скрытая переменная, которая устанавливается?

Может кто-нибудь объяснить мне, как этот объект nsstring (с именем json) содержит эти 4 аргумента?

Ответ №1:

Где-то еще в коде FormatString должен быть определен примерно так:

 NSString *formatString = @"latitude=%f, longitude=%f, %f = half the number of meters in a mile";
 

Убедитесь, что ваш тест выглядит следующим образом:

 NSLog(@"the format is %@ and the json is %@", formatString, json);
 

Они не должны выглядеть одинаково. Единственный способ, которым они будут выглядеть одинаково, — это если строка формата не ссылается ни на какие спецификаторы формата, например:

 NSString *formatString = @"I'm a silly format with no percent format specifiers";
 

Вот хорошее вступление по теме от Apple.

Ответ №2:

Который formatString на самом деле содержит %@ ‘s. Это может быть так:

 NSString *formatString = @"lat: %f | lon: %f | half-meters-per-mile: %f";

NSString *json = [NSString stringWithFormat:formatString,
                  centerLocation.latitude,
                  centerLocation.longitude,
                  0.5 * METERS_PER_MILE];
 

(я предполагаю, что замены ( %f ) могут быть неправильными)

Что касается того, как он содержит эти четыре аргумента, все после первого — это значения, которые вы хотите добавить в строку. Первая строка — это строка, в которой указано, куда поместить эти значения.

Ответ №3:

Если вы проверите руководство, следующая строка кода будет написана над тем, что вы опубликовали-

  NSString *jsonFile = [[NSBundle mainBundle] pathForResource:@"command" ofType:@"json"];
 NSString *formatString = [NSString stringWithContentsOfFile:jsonFile encoding:NSUTF8StringEncoding error:nil];
 

Отсюда создается строка формата, этот файл будет доступен в папке ресурсов вашего руководства.