I know Apple is big on having you use NS
objects instead of true primitive types, but I need the capabilities of an array (namely direct access of items at indices). However, it seems that they are so very keen on using NS
objects that I can't find a single tutorial online or in a textbook about how to use basic primitive arrays. I want something that does things like this does in 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));
The following is the closest I've gotten in Objective-C, but it won't run properly:
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]);
Also, if at all possible, is there something in O-C that will give me the count of non-null/non-nil objects in the array? (This way, I can tell how much space is left in the inventory so that the player can't pack away anything if it's full)
typically, you would use NSArray
/NSMutableArray
, although you could also use C arrays.
NSArray
(and most Foundation collections) cannot contain nil
entries - you can use NSPointerArray
(OS X) if you need nil
values, or simply use [NSNull null]
in an NSArray
to designate nil
.
Here's your program using an 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]);
Also, if at all possible, is there something in O-C that will give me the count of non-null/non-nil objects in the array?
An NSArray is a CFArray - they are "toll free bridged". Use CFArrayGetCountOfValue
with [NSNull null]
as the value to seek. Most of the CF-APIs are available in the NS-APIs, but not this one. You could easily wrap it in a category, if needed often.