recuento de objects en NSArray bidimensional

Tengo un NSArray dentro de un NSArray así que:

@[ @[ @1, @2, @3 ], @[ @7, @6 ] ] 

¿Cómo puedo usar el método valueForKeyPath: para get el número de elementos en cada matriz, por lo que esto:

 @[ @3, @2 ] 

He intentado [array valueForKeyPath:@"@count"] pero proporciona la misma respuesta que [array count] (así 2) como lo hace [array valueForKeyPath:@"count"] .

Use los operadores de colección @unionOfObjects y @count KVC conjuntamente:

 NSArray *counts = [array valueForKeyPath:@"@unionOfObjects.@count"]; 

El counts loggings en este caso produce:

 counts = ( 3, 2 ) 

Calling valueForKey: y sus variantes en una instancia de NSArray normalmente se utilizan para devolver una matriz formada a partir del resultado de la llamada valueForKey: en cada elemento del receptor. Entonces, [array valueForKey:@"count"] no devolverá el valor devuelto por -[NSArray count] sino que llamará valueForKey:@"count" en cada uno de sus elementos. Las matrices anidadas dentro de otros no se comportarán de manera diferente, por lo que no podemos utilizar @"count" como nuestra ruta key directamente, ya que intentará delegar ese cálculo en cada uno de sus elementos. El uso de @"@count" como la ruta key no funcionará, ya que funciona con la tecla a su izquierda, lo que implica ser el receptor del método valueForKeyPath: cuando no se especifica ninguna otra ruta key.

Lo que necesitamos es una forma de especificar que el operador @count no debe contar la matriz que encierra sino los elementos de la misma. Usar el operador de colección @unionOfObjects en nuestra ruta key lo logra. Si tenemos una ruta key como:

 @unionOfObjects.$COLLECTION.$REST_OF_KEYPATH 

Entonces, el resultado devuelto será la matriz formada por los resultados de enviar cada elemento de $COLLECTION a valueForKeyPath: post con $REST_OF_KEYPATH como argumento. Un último hecho: cuando el receptor de un post valueForKeyPath: es en sí mismo una colección, se puede especificar $COLLECTION en la ruta key con la cadena self .

Por consiguiente, nuestra ruta key debería ser similar a:

 @"@unionOfObjects.self.@count" 

Esto especifica que se devolverá una matriz con cada elemento como resultado de enviar -valueForKeyPath:@"@count" a cada elemento del receptor. Finalmente, y no estoy seguro acerca de la conveniencia de esto, pero parece que el auto puede eliminarse completamente del recorrido de la ruta siempre que el operador @unionOfObjects no sea el único componente de la ruta key. En este caso, sustituye el @unionOfObjects.$COLLECTION de la ruta key.

No estoy seguro exactamente cómo desea "get" el número de elementos en cada matriz (es decir, devolver un valor, o simplemente iniciar session en la console). Además, si solo desea la cantidad de elementos en cada sub-array, valueForKeyPath: no es el post que debe llamar …

Voy a asumir que solo quieres saber el conteo de cada sub-array dentro de la matriz.

Puede utilizar un bucle for para iterar por cada input en myArray y enviar el post count a cada input.

 NSArray *myArray = @[ @[@1, @2, @3], @[@7, @6] ]; for (NSArray *entry in myArray) { NSLog(@"array at index %lu has count %lu", [myArray indexOfObject:entry], [entry count]); } 

Dándole un paso más allá, en lugar de registrar los valores, puede almacenarlos en una variable para usar en cualquier otro lugar del progtwig.