是否有可以获得列数组的文字?

时间:2012-10-29 06:59:18

标签: objective-c

我试图在没有NSDictionary的情况下获得如下列数组。  它运作良好。

但我想知道objective-c literal是否支持此功能。

有这样的字面意思吗?

例如array [] [0] ?, array [*] [0],array [?] [0]等。?

NSArray *array1 = @[@"AAa", @"BBB", @"CCC"];
NSArray *array2 = @[@"AAb", @"BBB", @"CCC"];
NSArray *array3 = @[@"AAc", @"BBB", @"CCC"];

array = @[array1, array2, array3];

NSArray *result;
result = [self getColumnArray:0]; // <- get array's [*][0]
NSLog(@"result is : %@", result);

result = [self getColumnArray:2]; // <- get array's [*][2]
NSLog(@"result is : %@", result);


- (NSArray *)getColumnArray:(NSUInteger)index {
    NSMutableArray *resultArray = [NSMutableArray array];

    for (NSArray *item in array) {
        [resultArray addObject:item[index]];
    }

    return resultArray;
}


Excuted result :

2012-10-29 16:00:24.550 testButton[28245:11303] result is : (
    AAa,
    AAb,
    AAc
)
2012-10-29 16:00:24.552 testButton[28245:11303] result is : (
    CCC,
    CCC,
    CCC
)

2 个答案:

答案 0 :(得分:0)

是的可能......请参阅解决方案的链接 http://clang.llvm.org/docs/ObjectiveCLiterals.html

答案 1 :(得分:0)

以下代码可以使用:

NSArray *arr = @[ @[@"A", @"B"], @[@"C", @"D"]];
NSLog(@"%@", array[0][0]); // Logs 'A'

因此,你可以做这样的事情来达到你想要的效果:

// Log the 0 element of each NSArray within your primary array.
NSArray *primaryArray = @[ @[@"A", @"1"], @[@"A", @"2"], @[@"A", @"3"] ];
for (int i = 0; i < array.count; i++) {

     NSLog(@"%@", primaryArray[i][0]); // Logs "AAA"

}
// Or you can use a for (NSArray *arr in primaryArray) fast-enumeration loop.

据我所知,没有语法:

NSLog(@"%@", primaryArray[*][0]); // Could log "AAA"

这有几个原因。

  1. 没有说明primaryArray有多长。
  2. NSLog不知道它需要多少%@(其他用途的类似原因,例如你如何return primaryArray[*][0]?)
  3. 您正在将O(n)进程压缩为单个呼叫。如果有文档化的API,这可能会被原谅。
  4. 为了实现这一点,*运算符必须重载(在本例中为'wildcard'函数)并且Objective-C不支持运算符重载(除非在编译器中完成,我认为不是更长的'运算符重载',但'添加语言功能')。此外,*已经表示C中的指针,?三元运算符中使用了?:
  5. Objective-C已经有一个快速枚举结构来处理这些情况,如果要添加这个语法,你将重新发明轮子。
  6. 简而言之,快速枚举循环是执行所需操作的最佳方式,嵌套[i][0]框语法有助于其可读性。我同意通配符语法在某些情况下会非常方便(例如日志记录和枚举),但我认为全面简洁地实现它会非常困难。另外,由于他们为了^超载了块,他们的可用运算符已经用完了!