Hay una sintaxis literal para mutable colecciones?

Sé que puedo crear un NSArray con @[@"foo", @"bar"] o un NSDictionary con @{@0 : @"foo", @1 : @"bar"}.

Hay un literal de sintaxis para crear una NSMutableArray o un NSMutableDictionary?

  • Pero no hay que olvidar que su NSDictionary *dictionary = @{@"key" : @"value"};, podría ser confuso con él la forma en que usted ha escrito. Diferente de :objectsWithKeys.
InformationsquelleAutor ma11hew28 | 2012-09-14

5 Kommentare

  1. 17

    No. Igual de cómo no hay una sintaxis para la creación de un NSMutableString bien. Los objetos mutables no son particularmente adecuados para los valores literales.

    • De acuerdo con la última frase. Programación en Python, por ejemplo, las colecciones se crean literalmente y mutable de forma predeterminada. Puede ser muy útil.
    • Qué python incluso han inmutable colecciones?
    • Sí, hay cosas que se llama «tuplas», que son inmutables. > (1, 2, 3) # tuple (immutable array) > [1, 2, 3] # list (mutable array)
    • según se publica a continuación se realizan las siguientes acciones NSMutableArray *list = [@[] mutableCopy]; es decir, agregar mutableCopy al final. Que es cómo el literal especificado
    • Eso no es un literal. Esa es una expresión que se utiliza un literal.
    • Estás en lo correcto en la semántica. Pero de lo que sucede a partir de la programación de la perspectiva es que la expresión es la forma de inicializar un objeto mutable con algunos datos en una forma corta de la sintaxis. El compilador se encargará de optimizar esto, así que probablemente reduce las instrucciones de la cpu y de la memoria de copias. Y menos para escribir. Que es más breve. Que es lo que se desea. La respuesta » no » es técnicamente correcto, pero no es tan útil como muestra de la expresión.
    • No, el compilador no que optimizar. Obj-C no permite el compilador para optimizar esa. Es necesario construir una inmutable de la matriz de la literal, y, a continuación, invocar mutableCopy en el resultado. La expresión [@[] mutableCopy] simplemente no puede ser llamado un literal. Incluso si se ha optimizado, todavía no es un literal.
    • Estás en lo correcto, pero me da su punto de vista. El uso literal de la sintaxis y la adición de mutableCopy al final se ve mejor que la mayoría de alternativas y es fácil de escribir. No es una respuesta a la OP de la pregunta, pero puede ser una solución a la OP del problema.

  2. 101

    No hay una construida en forma, pero yo generalmente uso mutableCopy como este:

    NSMutableArray *array = [@[ @"1", @"2", @"3" ] mutableCopy];
    • Esto parece menos eficiente y no mucho más corto que [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil].
    • O, alternativamente: «NSMutableArray *array = [NSMutableArray arrayWithArray:@[ @»1″, @»2″, @»3″ ]];» – a pesar de que me gusta tu ejemplo mejor 🙂
    • Hay un builtin manera en NSJSONSerialization.
    • que no es, definitivamente, una sintaxis literal.
    • Tengo que estar de acuerdo con @MattDiPasquale del comentario; esto es apenas más corto que NSMutableArray arrayWithObjects:..., es de suponer que la menos eficiente de lo poco que importa, y – a mis ojos – un poco menos legible demasiado. Una concisa sintaxis literal hubiera sido agradable, pero si esto es lo más cercano a ella, entonces creo que me quedo con el menos chapucero-sensación de arrayWithObjects para inicializar matrices mutables.
    • Cómo es que menos chapucero? La sintaxis literal se expande a +[NSArray arrayWithObjects:count:], no arrayWithObjects por lo que la sintaxis literal valida que todos los elementos son no nulas.
    • La creación de un innecesario objeto intermedio y, a continuación, tomar una copia de ella sólo para ahorrar unos personajes comparado directamente la creación de la NSMutableArray con uno de sus propios initialiser métodos es lo que se siente hacky a mí.
    • Como en el significado de los asuntos comentó acerca de su propia NSJSONSerialization respuesta, mutableCopy sólo hace una copia superficial. Eso puede ser suficiente, pero si no es su NSJSONSerialization solución es la única hasta el momento.
    • Usted también puede hacer NSMutableArray *array = @[].mutableCopy; que parece más legible.

  3. 17

    Pero, ¿hay una literal de la sintaxis para la creación de un NSMutableArray o un NSMutableDictionary?

    No. La mejor alternativa:

    [@[ @"foo", @"bar"] mutableCopy]
  4. 8

    Sí. Pero no del todo. Echa un vistazo a este;

    NSMutableArray *list = [@[] mutableCopy];

    Esto crea una matriz mutable @[] y llamadas mutableCopy que devuelve un NSMutableArray *. En lugar de @[], usted puede dar un literal de matriz.

    • ¿Sabes de cuestiones derivadas del uso de esta en lugar de la mano?
  5. 3

    Si usted tiene un anidada literal de las matrices y de los diccionarios, se puede convertir esto en una totalmente mutable versión yendo a través de NSJSONSerialization. Por ejemplo:

    NSArray* array = @[ @{ @"call" : @{ @"devices" : @[ @"$(devices)" ] } } ];
    NSData* data   = [NSJSONSerialization dataWithJSONObject:array 
                                                     options:0 
                                                       error:nil];
    
    NSJSONReadingOptions options = NSJSONReadingMutableContainers | 
                                   NSJSONReadingMutableLeaves;
    NSMutableArray* mutableArray = [NSJSONSerialization JSONObjectWithData:data 
                                                                   options:options
                                                                     error:nil];

    Es un poco de un desvío, pero al menos usted no tiene que escribir el código. Y lo bueno es que NSJSONSerialization es muy rápido.

    • Uh loco, kit jsonkit es más rápido. Por 5x. Además, este es demasiado tortuosa. Sólo uso -mutableCopy, entonces usted puede utilizar opcionalmente -grupo de liberación automática.
    • Venga tio: Los dos años de edad kit jsonkit leeme –bien mantenidos cosas por cierto– sí dice que fue sólo el 25% – 40% más rápido. Y -mutableCopy sólo hace una copia superficial. La única manera es hacer algo ‘indirecta’.
    • también se puede simplemente hacer esto: [[NSMutableArray alloc] initWithArray:@[@»A»,@»B»]]. lo siento por la downvote, pero serializar y deserializar es una locura y no funciona con muchos tipos de objetos.
    • En primer lugar, loco? Usted está tomando un ejemplo muy simple, no es mi ejemplo. Por favor, escriba @[ @{ @"call" : @{ @"devices" : @[ @"$(devices)" ] } } ] y verás cómo loca que es. Segundo, esto funciona para el tipo dado en @MattDiPasquale y mi ejemplo. Aún más, yo mencione explícitamente que esto funciona para los literales. Así que por favor no pedir disculpas!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea