0

NSDictionary なしで次のような列配列を取得しようとしています。それはうまくいきます。

しかし、objective-c リテラルがこの機能をサポートしているかどうかを知りたいです。

このようにするリテラルはありますか?

例: 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
)
4

2 に答える 2

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) プロセスを 1 つの呼び出しに凝縮しています。文書化された API があれば、これは許される可能性があります。
  4. これを可能にするには、* 演算子をオーバーロードする必要があり (この場合は「ワイルドカード」関数に)、Objective-C は演算子のオーバーロードをサポートしていません (コンパイラ内で行われる場合を除きます。オーバーロード」ではなく「言語機能の追加」)。また、*既に C ではポインターを示し、三項演算子?で使用されます。?:
  5. Objective-C には、これらの状況を処理する高速列挙構造が既にあります。この構文が追加されると、車輪を少し再発明することになります。

要するに、高速列挙ループは目的を達成するための最良の方法であり、ネストされた[i][0]ボックス構文はその読みやすさをわずかに助けます。場合によっては (ロギングや列挙など) ワイルドカード構文が非常に便利であることには同意しますが、全面的に簡潔に実装するのは難しすぎると思います。^さらに、ブロックをオーバーロードしたため、使用可能な演算子が不足しています!

于 2012-10-29T08:09:31.240 に答える
0

はい可能です...ソリューションのリンクを参照して ください http://clang.llvm.org/docs/ObjectiveCLiterals.html

于 2012-10-29T07:06:16.763 に答える