IOS/Objective-C:将另一个变量添加到 mutableArray

IOS/Objective-C:Add another variable to a mutableArray

我有一个简单的字符串数组,如下所示:

myArray *NSArray = [NSArray arrayWithObjects: @"chevy", @"ford", @"toyota", nil];

我想向数组添加另一个维度,例如 @"1",@"2",@"3" 以跟踪顺序。

有没有简单的方法可以做到这一点?

编辑

我找到了答案 here。创建第二个数组并使用循环:

//For your 2D array
NSMutableArray *secondArray = [[NSMutableArray alloc] initWithCapacity:[homePlayersArray count]];

//populate as required
for(int i=0;i<[homePlayersArray count];i++){
    NSArray *tempArray = [[NSArray alloc] initWithObjects:[homePlayersArray objectAtIndex:i],[NSNumber numberWithInt:0], nil];
    [secondArray addObject:tempArray];
}

那些应该是键值对吗?如果是这样,最好使用 NSDictionary:

NSDictionary *dictionary = @{ @"1" : @"chevy", @"2" : @"ford", @"3" : @"toyota"};

创建 NSDictionary 而不是 NSArray

NSDictionary *dictionaryOfCars = @{ @"1" : @"chevy", @"2" : @"ford", @"3" : @"toyota"};

您可以使用以下方式访问字典中的任何项目:

id item = [dictionaryOfCars objectForKey:@"1"];// item  = @"chevy"

与其使用两个数组(根据您对问题的编辑),这可能会导致两者彼此不同步,不如考虑使用字典数组。

例如,您的数组可能开始为:

NSArray *myArray = @[ @{ @"make" : @"chevy" }.mutableCopy,
                      @{ @"make" : @"ford" }.mutableCopy,
                      @{ @"make" : @"toyota" }.mutableCopy
                   ];

这会为您生成 NSArray(不可变)的 NSMutableDictionary(可变)- 因此您拥有数组的排序和可变字典的灵活性来添加您的额外变量。例如,要将订单号 106249 添加到您可以使用的第一个条目:

NSMutableDictionary *entry = (NSMutableDictionary *)myArray[0];
entry[@"orderNumber"] = @106249;

如果您使用 Objective-C 的 轻量级泛型 功能,您可以将数组定义为:

NSArray <NSMutableDictionary *> *myArray = @[ ... ];

这会通知编译器该数组将只包含可变字典,这反过来又允许将顺序号设置为:

myArray[0][@"orderNumber"] = @106249;

无需使用任何转换。

减少错误的下一步是为键定义常量:

const NSString *kMake = @"make";
const NSString *kOrderNumber = @"orderNumber";

最终示例代码如下所示:

NSArray <NSMutableDictionary *> *myArray
   = @[ @{ kMake : @"chevy" }.mutableCopy,
        @{ kMake : @"ford" }.mutableCopy,
        @{ kMake : @"toyota" }.mutableCopy
     ];

myArray[0][kOrderNumber] = @106249;

如果您需要向其中添加新条目,您当然也可以使数组本身可变。下一阶段是使用 makeorderNumber 属性定义您自己的 class 而不是使用字典。

HTH

解决此问题的最直接方法是创建第二个数组,然后按照 this answer 中的建议循环遍历记录。有关具有一些优势的更复杂的方式,请参阅 CRD 的答案。其他答案没有解决这个问题。

//For your 2D array
NSMutableArray *secondArray = [[NSMutableArray alloc] initWithCapacity:[homePlayersArray count]];

//populate as required
for(int i=0;i<[homePlayersArray count];i++){
    NSArray *tempArray = [[NSArray alloc] initWithObjects:[homePlayersArray objectAtIndex:i],[NSNumber numberWithInt:0], nil];
    [secondArray addObject:tempArray];
}