-1

私はobjcの初心者です。簡単な質問があります。NSInteger値のマトリックスがあります。それは「curBoard」と呼ばれます。(x、y)座標の値を値「curStep」で更新したい。「算術演算の場合、void型のオペランド...」というエラーがあります。

私は何を間違っているのですか?

[curBoard replaceObjectAtIndex:x withObject:(NSMutableArray *)[[curBoard objectAtIndex:x] replaceObjectAtIndex:y withObject:(NSInteger *)[NSNumber numberWithInt:curStep]]];

アップデート:

NSMutableArray *board; 
board = [NSMutableArray new]; 
for(NSInteger i = 0; i<boardSize; i++) { 
    NSMutableArray *row = [NSMutableArray new]; 

    for(NSInteger j = 0; j < boardSize; j++) 
        [row addObject:(NSInteger *)[NSNumber numberWithInt:0]]; 
        [board addObject:row]; 
    } 
4

2 に答える 2

3

このwithObject:(NSInteger *)[NSNumber numberWithInt:curStep]]部分が問題の原因です。NSNumberオブジェクトとして保存する場合は、次を使用する必要があります。

... withObject:[NSNumber numberWithInt:curStep]]

編集: 上記のコードから、次のように追加する必要があります。

[row addObject:[NSNumber numberWithInt:0]]; 

NSIntegerはポインタ型ではないため、NSNumber自体を使用して配列に追加する必要があります。

于 2013-03-08T20:14:42.703 に答える
2

Objective-Cは基本的に、Cにストラップされたオブジェクト構文の集まりです。全体的な効果は、ジェットパックを馬にストラップで固定するようなものです。2つの部分が実際にはうまく機能しない場合があります。この場合、あなたは本当にスロットルを開けるべきときに、馬に目がくらむように言うことによってより速く行こうとしています。

NSMutableArrayはjetpackの一部であり、Objective-Cオブジェクトであり、Objective-Cオブジェクトの配列を処理するためにのみ装備されています。しかしNSInteger、これは馬の一部です。これはプリミティブC整数型であり、実際のオブジェクトではありません。*

NSIntegerクラスのように大文字で表記され、クラスのように接頭辞が付いていることは知っていNSますが、実際にはCの生き物です。これは自分で確認できます。XcodeでCmd-Oと入力し、ポップアップする[OpenQuickly]ダイアログに「NSInteger」と入力します。その定義にジャンプすることができます。私の現在のMacプロジェクトでは、それはtypedef long NSInteger;; longプリミティブCタイプの1つです。

NSNumber2つを橋渡しするために存在します。これは、C数値タイプを内部に保持するために特別に設計されたオブジェクトです。NSNumberはオブジェクトでNSMutableArrayあり、他のObjective-Cのものはそれを処理できます。

NSNumberただし、との間でキャストすることはできませんNSIntegerNSNumberその中に保持しますが、NSIntegerそれはそれが実際にそれ自体であるという意味ではありませんNSInteger。ビニール袋にサンドイッチを入れると食べられません。

代わりに、NSNumber+numberWithInteger:メソッドを使用して、を作成しNSNumber-integerValue整数を元に戻す必要があります。(通常は機能+numberWithInt:-intValueますが、アプリが32ビットプロセッサと64ビットプロセッサのどちらで実行されているかによって、値が非常に大きい場合は動作が異なる場合があります。)実際、最近では、代わりに、はるかに短いと言うことができ[NSNumber numberWithInteger:foo]ます@(foo)。 ****

したがって、数字を追加するときは、次のように言う必要があります。

[row addObject:@(0)];

そして、後でその番号を戻したいときは、次のように言います。

n = [[row objectAtIndex:y] integerValue];

-replaceObjectAtIndex:withObject:エラーは別の話です。-replaceObjectAtIndex:withObject:何も返さないので、引数として使用することはできません。幸いなことに、この場合は必要ありません。-replaceObjectAtIndex:withObject:新しい配列は作成されません。すでに内部[curBoard objectAtIndex:x]にある配列を変更するため、何もする必要はありませんcurBoard。代わりに、次のように書くことができます。

[[curBoard objectAtIndex:x] replaceObjectAtIndex:y withObject:@(curStep)];

*実際に使用NSInteger *しましたが、少し異なります。は*「ポインタ」を意味するのでNSInteger *、プリミティブ整数へのポインタも同様です。NSNumber *これは、オブジェクトへのポインタのようなものなNSNumberので、コンパイラでキャストできます。

ポインターをキャストしても、ポインターのもう一方の端のデータは変換されないことに注意してください。コンパイラに同じデータを異なる方法で解釈させるだけです。実際にNSInteger *ポインタを使用してデータを取得しようとすると、ガベージデータを取得するか、(理由が大きすぎてこのマージン内に収まらないため)クラッシュします。

ただし、この場合、Jediがコンパイラーをだまして、値がへのポインターであると考えさせたら、NSIntegerそれをに渡そうとし-addObject:ます。-addObject:オブジェクトへのポインタを期待しているため、コンパイラは代わりにポインタを渡すことを躊躇しますNSInteger

**この構文は、iOS 6 SDK Xcode 4.4以降を使用している限り、実際に古いiOSでアプリを実行している場合でも機能します。また、自動的に適切な方法が使用される+numberWithWhatever:ため、最適な方法を選択することを心配する必要はありません。のような数値リテラルを使用して0いる場合、括弧はオプションですが、変数または定数を使用する場合は必須です。もちろん、必要に応じて言葉で表現することもできますが、最近はほとんど意味がありません。

于 2013-03-10T09:21:57.977 に答える