Генерация списка строк в Obj C [закрыто]

Обратите внимание, что 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();
}
-11
задан Kamil Budziewski 16 August 2013 в 11:04
поделиться

5 ответов

Я не могу себе представить, как использование строки 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"
)

Обратите внимание, что в наивном решении нет ничего особенно плохого . Он просто более хрупкий, менее эффективный и содержит больше кода, чем необходимо.

Одно возможное лучшее решение

  1. Добавьте все изображения в проект приложения в качестве ресурсов.

  2. Используйте NSBundle API для одновременного получения URL-адресов всех изображений.

То есть:

NSArray *paths = [[NSBundle mainBundle] pathsForResourcesOfType: @"jpg" inDirectory: nil];

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

Все это - и многое другое - описано в руководстве по программированию ресурсов .

37
ответ дан 9 September 2019 в 21:07
поделиться

Я не совсем уверен, что вы пытаетесь сделать, но это может быть источником вдохновения:

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 делает некоторые вещи чрезвычайно сложными, вы можете получить некоторое преимущество, если действительно изучите его;)

2
ответ дан 9 September 2019 в 21:07
поделиться

Простейший код, который делает то, что вы хотите, будет примерно таким:

NSMutableString * string = [NSMutableString string];
for (int i = 1; i <= NUMIMAGES; i++) [string appendFormat: @"image%d.jpg", i];

Вот и все. Как видите, appendFormat: действительно упрощает лот ! Но я не могу понять, зачем вам это нужно. Вы получите что-то вроде:

"image1.jpgimage2.jpgimage3.jpgimage4.jpgimage5.jpg. . ."

Чего вы на самом деле пытаетесь достичь? Дэйв

1
ответ дан 9 September 2019 в 21:07
поделиться

Во-первых, ваш синтаксис для вызова методов отключен - я рекомендую прочитать 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];
}
7
ответ дан 9 September 2019 в 21:07
поделиться

Ценю все ответы!
Иногда кажется, что нужно быть мазохистом, чтобы хорошо владеть Целью 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]; 
}
-7
ответ дан 9 September 2019 в 21:07
поделиться