生成Obj C中的字符串列表

时间:2010-06-12 20:01:23

标签: objective-c cocoa nsbundle nsmutablestring

似乎Objective C通过篮球跳跃使得看似简单的任务非常困难。

我只需要创建一系列字符串image1.jpgimage2.jpg等等

即在循环中 var imgString:String='image'+i+'.jpg;

我认为最佳做法是使用NSMutableString appendString方法?

我做错了什么?

NSMutableString *imgString;

    for(int i=1;i<=NUMIMAGES;i++){
    imgString.appendString(@"image"+i+@".jpg");
}

我收到以下错误

  

错误:在某个结构中请求成员'appendString'   或者工会

5 个答案:

答案 0 :(得分:37)

我无法想象在您对自己问题的“回答”中image5image4image3image2image1.jpg中的字符串string3如何产生问题可能被视为有用或解决方案(我将您的代码粘贴到Xcode Foundation工具项目中) w / NUMIMAGES设置为5)。

似乎Objective C跳过了箍,使看似简单的任务变得非常困难。

阅读the Objective-C Guidethe String Programming Guide,然后得出结论。批评你不理解的东西通常会适得其反(我们都已经完成了 - 但是当受挫时很容易做到。)

我只需要创建一系列字符串,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一次抓取所有图片的网址。

  3. 即:

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

    这不仅可以从代码中删除图像名称的硬编码,还可以让系统优化目录枚举和路径生成。如果你只想加载一部分图像 - 比如你正在编写游戏并拥有一系列与怪物相关的图像 - 那么将所有相关图像放在一个目录中,将目录添加到资源中,然后传递directory的名称作为上述方法的第二个参数。

    所有这些 - 以及更多 - 都记录在resource programming guide

答案 1 :(得分:7)

首先,您调用方法的语法是关闭的 - 我建议您阅读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];
}

答案 2 :(得分:2)

我不确定你要做什么,但这可能是一个灵感:

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的{​​{1}}方法,或者您可以创建一个新的不可变字符串:

NSMutableString

如果要连接更多字符串,可以使用NSString *one = @"Hello, "; NSString *two = [one stringByAppendingString:@"world!"]; 初始值设定项:

stringWithFormat

如果您仍然认为Objective-C使某些事情变得非常困难,那么通过实际学习它可能会获得一些优势;)

答案 3 :(得分:1)

执行您想要的最简单的代码是这样的:

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

就是这样。正如您所看到的,appendFormat:确实让事情变得更轻松了很多!但我无法弄清楚你为什么要这样做。你会得到类似的东西:

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

你到底想要实现什么目标? 戴夫

答案 4 :(得分:-7)

欣赏所有答案!
有时候感觉需要成为受虐狂才能精通Objective 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]; 
}