-11

似乎 Objective C 跳过了一些障碍,使看似简单的任务变得异常困难。

我只需要创建一个字符串序列,image1.jpg,image2.jpg

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

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

我究竟做错了什么??

NSMutableString *imgString;

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

我收到以下错误

错误:在不是结构或联合的东西中请求成员“appendString”

4

5 回答 5

38

我无法想象在您自己的问题的“答案”中生成字符串如何image5image4image3image2image1.jpgstring3解释为有用或解决方案(我将您的代码粘贴到 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。

IE:

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

这不仅从代码中删除了图像名称的硬编码,还允许系统优化目录枚举和路径生成。如果你只想加载图片的一个子集——假设你正在编写一个游戏并且有一系列与怪物相关的图片——然后将所有相关的图片放在一个目录中,将目录添加到你的资源中,然后传递目录的名称作为上述方法的第二个参数。

所有这些 - 以及更多 - 都记录在资源编程指南中。

于 2010-06-12T21:22:40.953 回答
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];
}
于 2010-06-12T20:17:15.957 回答
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!"];

正如您在第一行中看到的,在使用对象之前初始化对象是个好主意:) 要连接字符串,您可以使用appendStringof 方法,NSMutableString也可以创建一个新的不可变字符串:

NSString *one = @"Hello, ";
NSString *two = [one stringByAppendingString:@"world!"];

如果你有更多的字符串要连接,你可以使用stringWithFormat初始化器:

NSString *composed = [NSString stringWithFormat:@"%@, %@ %@!",
     @"Hello", @"Objective-C", @"world"];

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

于 2010-06-12T20:03:37.843 回答
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. . ."

你到底想达到什么目的?戴夫

于 2010-06-12T21:49:25.943 回答
-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]; 
}
于 2010-06-12T20:30:14.703 回答