Обратите внимание, что property_tree
интерпретирует ключи как пути, например. старая пара «a.b» = «z» создаст {"a": {"b": "z"}} JSON, а не {"a.b": "z"}. В противном случае использование property_tree
тривиально. Вот небольшой пример.
#include <sstream>
#include <map>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
using boost::property_tree::read_json;
using boost::property_tree::write_json;
void example() {
// Write json.
ptree pt;
pt.put ("foo", "bar");
std::ostringstream buf;
write_json (buf, pt, false);
std::string json = buf.str(); // {"foo":"bar"}
// Read json.
ptree pt2;
std::istringstream is (json);
read_json (is, pt2);
std::string foo = pt2.get<std::string> ("foo");
}
std::string map2json (const std::map<std::string, std::string>& map) {
ptree pt;
for (auto& entry: map)
pt.put (entry.first, entry.second);
std::ostringstream buf;
write_json (buf, pt, false);
return buf.str();
}
Я не могу себе представить, как использование строки image5image4image3image2image1.jpg
в string3
в вашем «ответе» на ваш вопрос может быть истолковано как полезное или полезное. решение (я вставил ваш код в проект инструмента Xcode Foundation с параметром NUMIMAGES, равным 5).
Кажется, что Objective C перескакивает через обруч, делая казалось бы простые задачи чрезвычайно трудными.
Прочтите Руководство по Objective-C и Руководство по программированию строк , затем сделайте свои выводы. Критика чего-то, чего вы не понимаете, обычно контрпродуктивна (хотя мы все это делали - легко сделать, когда вы расстроены).
Мне просто нужно создать последовательность строк, image1.jpg, image2.jpg и т.д. и т.д.
#define NUMIMAGES 5
NSMutableArray *fileNames = [NSMutableArray array];
for(int i = 0; i<5; i++)
[fileNames addObject: [NSString stringWithFormat: @"image%d.jpg", i]];
NSLog(@"fileNames %@", fileNames);
Выводы:
fileNames (
"image0.jpg",
"image1.jpg",
"image2.jpg",
"image3.jpg",
"image4.jpg"
)
Обратите внимание, что в наивном решении нет ничего особенно плохого . Он просто более хрупкий, менее эффективный и содержит больше кода, чем необходимо.
Добавьте все изображения в проект приложения в качестве ресурсов.
Используйте NSBundle API для одновременного получения URL-адресов всех изображений.
То есть:
NSArray *paths = [[NSBundle mainBundle] pathsForResourcesOfType: @"jpg" inDirectory: nil];
Это не только удаляет жесткое кодирование имен изображений из вашего кода, но также позволяет системе оптимизировать перечисление каталогов и создание путей. Если вы хотите загрузить только подмножество изображений - скажем, вы пишете игру и имеете серию изображений, связанных с монстрами - тогда поместите все связанные изображения в один каталог, добавьте каталог в свои ресурсы, затем передайте это имя каталога в качестве второго аргумента вышеупомянутого метода.
Все это - и многое другое - описано в руководстве по программированию ресурсов .
Я не совсем уверен, что вы пытаетесь сделать, но это может быть источником вдохновения:
NSMutableArray *fileNames = [NSMutableArray array];
for (int i=0; i<max; i++)
[fileNames addObject:[NSString stringWithFormat:@"image%i.jpg", i]];
Что касается вашей ошибки, вы используете синтаксис точки, где это не так ' не имеет никакого смысла. Кроме того, вы не используете +
для объединения строк в Objective-C. Правильный синтаксис appendString
выглядит следующим образом:
NSMutableString *foo = [NSMutableString string];
[foo appendString:@"Hello, "];
[foo appendString:@"world!"];
Как вы можете видеть в первой строке, рекомендуется инициализировать объекты перед их использованием :) Для объединения строк вы можете использовать appendString
метода NSMutableString
, или вы можете создать новую неизменяемую строку:
NSString *one = @"Hello, ";
NSString *two = [one stringByAppendingString:@"world!"];
Если вам нужно объединить больше строк, вы можете использовать инициализатор stringWithFormat
:
NSString *composed = [NSString stringWithFormat:@"%@, %@ %@!",
@"Hello", @"Objective-C", @"world"];
Если у вас все еще есть ощущение, что Objective-C делает некоторые вещи чрезвычайно сложными, вы можете получить некоторое преимущество, если действительно изучите его;)
Простейший код, который делает то, что вы хотите, будет примерно таким:
NSMutableString * string = [NSMutableString string];
for (int i = 1; i <= NUMIMAGES; i++) [string appendFormat: @"image%d.jpg", i];
Вот и все. Как видите, appendFormat:
действительно упрощает лот ! Но я не могу понять, зачем вам это нужно. Вы получите что-то вроде:
"image1.jpgimage2.jpgimage3.jpgimage4.jpgimage5.jpg. . ."
Чего вы на самом деле пытаетесь достичь? Дэйв
Во-первых, ваш синтаксис для вызова методов отключен - я рекомендую прочитать Apples Introduction to Objective-C . Примечательно, что для вызова метода вы используете синтаксис [someObject someMethod]
.
Следующая проблема заключается в том, что вы никогда не создаете строку, к которой пытаетесь добавить, вы можете использовать, например, [NSMutableString string]
для этого.
Далее, чтобы объединить изменяемую строку с некоторой форматированной строкой, используйте -appendFormat:
, например:
NSMutableString *imgString = [NSMutableString string];
for (int i=1; i<=NUMIMAGES; i++) {
if (i > 1) [imgString appendString:@", "];
[imgString appendFormat:@"image%d.jpg", i];
}
Ценю все ответы!
Иногда кажется, что нужно быть мазохистом, чтобы хорошо владеть Целью C !.
Попробует описанное выше, но в итоге использовал
NSString *string1 = @"image";
NSString *string2;
NSString *string3 = @".jpg";
NSString *incString; //*/
for(int i=1;i<=NUMIMAGES;i++)
{
incString=[NSString stringWithFormat:@"%d",i];
string2 = [string1 stringByAppendingString:incString];
string3 = [string2 stringByAppendingString:string3];
}