2

NSAppleは、真のプリミティブ型の代わりにオブジェクトを使用することに大きな関心を持っていることは知っていますが、配列の機能(つまり、インデックスでのアイテムへの直接アクセス)が必要です。しかし、彼らはオブジェクトの使用に非常に熱心であるためNS、オンラインまたは基本的なプリミティブ配列の使用方法に関する教科書で単一のチュートリアルを見つけることができないようです。私はJavaでこのようなことをする何かが欲しいです

String inventory[] = new String[45];

inventory[5] = "Pickaxe";
inventory[12] = "Dirt";
inventory[8] = "Cobblestone";

inventory[12] = null;

System.out.println("There are " + inventory.length + " slots in inventory: " + java.util.Arrays.toString(inventory));

以下は私がObjective-Cで得たものに最も近いものですが、正しく実行されません。

NSString *inventory[45];

inventory[5] = @"Pickaxe";
inventory[12] = @"Dirt";
inventory[8] = @"Cobblestone";

inventory[12] = nil;

NSArray *temp = [NSArray arrayWithObjects:inventory count:45];
NSLog(@"There are %i slots in inventory: %@", [temp count], [temp description]);

また、可能であれば、配列内のnull以外/nil以外のオブジェクトの数を取得する何かがOCにありますか?(このようにして、在庫に残っているスペースの量を知ることができるので、プレーヤーがいっぱいになった場合に何も詰めることができません)

4

2 に答える 2

2

C スタイルの配列を使用します。目的の c では、任意の c コードが機能します。十分に注意しない限り、目的の C スタイル オブジェクトと C スタイル コードを混在させないようにしてください。メモリ管理が奇妙になり、オブジェクト タイプとプリミティブの違いで混乱しやすくなります。

于 2012-04-04T04:54:31.253 に答える
2

通常はNSArray/を使用しNSMutableArrayますが、C 配列を使用することもできます。

NSArray(およびほとんどの Foundation コレクション) にはnilエントリを含めることができません。値NSPointerArrayが必要な場合は (OS X) を使用nilするか、単に を使用[NSNull null]して.NSArraynil

を使用したプログラムは次のNSArrayとおりです。

NSMutableArray * inventory = [NSMutableArray array];
for (NSUInteger idx = 0; idx < 45; ++idx) {
  [inventory addObject:[NSNull null]];
}

[inventory replaceObjectAtIndex:5 withObject:@"Pickaxe"];
[inventory replaceObjectAtIndex:12 withObject:@"Dirt"];
[inventory replaceObjectAtIndex:8 withObject:@"Cobblestone"];

[inventory replaceObjectAtIndex:12 withObject:[NSNull null]];

NSArray *temp = [NSArray arrayWithObject:inventory];
NSLog(@"There are %i slots in inventory: %@", [temp count], [temp description]);

また、可能であれば、OC に配列内の非 null/非 nil オブジェクトの数を教えてくれるものはありますか?

NSArray は CFArray です。これらは「無料でブリッジ」されています。シークする値としてCFArrayGetCountOfValuewithを使用します。[NSNull null]ほとんどの CF-API は NS-API で使用できますが、これは使用できません。頻繁に必要な場合は、簡単にカテゴリにラップできます。

于 2012-04-04T04:57:21.807 に答える