-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.jpg自分の質問に対する「回答」の文字列を生成することが、有用または解決策として解釈される方法を想像することはできませんstring3(NUMIMAGES を 5 に設定して、コードを Xcode Foundation ツール プロジェクトに貼り付けました)。

Objective C は、一見単純なタスクを非常に困難にするために、フープを飛び越えているようです。

Objective-C GuideString 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 つ

  1. すべての画像をアプリケーション プロジェクトにリソースとして追加します。

  2. NSBundle API を使用して、すべての画像への URL を一度に取得します。

すなわち:

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

これにより、コードからイメージ名のハードコーディングが削除されるだけでなく、システムがディレクトリの列挙とパスの生成を最適化できるようになります。画像のサブセットのみをロードする場合 (ゲームを作成していて、モンスターに関連する一連の画像があるとします)、関連するすべての画像を 1 つのディレクトリに配置し、そのディレクトリをリソースに追加してから、それを渡します。上記のメソッドの 2 番目の引数としてディレクトリの名前。

これらすべて (およびその他の多くのこと) は、リソース プログラミング ガイドに記載されています。

于 2010-06-12T21:22:40.953 に答える
7

まず、メソッドを呼び出すための構文がオフになっています。ApplesIntroductiontoObjective-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!"];

最初の行でわかるように、オブジェクトを使用する前にオブジェクトを初期化することをお勧めします:) 文字列を連結するには、appendStringメソッドを使用する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 に答える