Pregunta

Parece que el Objetivo C salta a través de aros para hacer tareas aparentemente simples extremadamente difícil.

Simplemente necesita para crear una secuencia de cadenas, image1.jpg, image2.jpg, etc, etc

es decir, en un bucle var imgString:String='image'+i+'.jpg;

Me asuma una mejor práctica es utilizar un método NSMutableString con appendString?

¿Qué estoy haciendo mal ??

NSMutableString *imgString;

    for(int i=1;i<=NUMIMAGES;i++){
    imgString.appendString(@"image"+i+@".jpg");
}

Me sale el siguiente error

  

error: solicitud de miembro appendString 'en algo que no es una estructura   o unión

¿Fue útil?

Solución

No puedo imaginar cómo produciendo el image5image4image3image2image1.jpg cadena en string3 en su "respuesta" a su propia pregunta podría ser interpretado como útil o una solución (me pega el código en un proyecto herramienta Fundación Xcode w / NUMIMAGES establecidos a 5).

Parece que el Objetivo C salta a través de aros para hacer tareas aparentemente simples extremadamente difícil.

el Objetivo C-Guide y la Guía de Programación de cuerdas , a continuación, hacer sacar sus conclusiones. Criticar algo que no entiende generalmente es contraproducente (todo lo hemos hecho, sin embargo - fácil de hacer cuando se siente frustrado).

que simplemente necesitan para crear una secuencia de cadenas, imagen1.jpg, image2.jpg, etc, etc

solución Naive:

#define NUMIMAGES 5
NSMutableArray *fileNames = [NSMutableArray array];
for(int i = 0; i<5; i++)
    [fileNames addObject: [NSString stringWithFormat: @"image%d.jpg", i]];
NSLog(@"fileNames %@", fileNames);

Salidas:

fileNames (
    "image0.jpg",
    "image1.jpg",
    "image2.jpg",
    "image3.jpg",
    "image4.jpg"
)

Tenga en cuenta que no hay nada malo en particular con la solución ingenua. Es simplemente más frágil, menos eficientes y más código que es necesario.

Una posible solución mejor

  1. Agrega todas las imágenes en su proyecto de aplicación como recursos.

  2. El uso de la API NSBundle a direcciones URL para agarrarse a todas las imágenes a la vez.

es decir:.

NSArray *paths = [[NSBundle mainBundle] pathsForResourcesOfType: @"jpg" inDirectory: nil];

Esto no sólo quitar hardcoding de nombres de imágenes a partir de su código, sino que también permite que el sistema de enumeración de directorio y optimizar la generación de la trayectoria. Si desea cargar sólo un subconjunto de imágenes - decir que usted está escribiendo un juego y tienen una serie de imágenes relacionadas con los monstruos - a continuación, poner todas las imágenes relacionadas en un solo directorio, añadir el directorio a sus recursos, a continuación, pasar esa el nombre del directorio que el segundo argumento del método anterior.

Todo esto - y mucho más - se documenta en el recursos guía de programación .

Otros consejos

En primer lugar, su sintaxis para invocar métodos está apagado - recomiendo la lectura a través de las manzanas Introducción a Objective-C . Cabe destacar que, para invocar un método que utilice la sintaxis [someObject someMethod].

El siguiente problema es que nunca se crea la cadena que está tratando de anexados para, por ejemplo, se puede utilizar [NSMutableString string] para eso.

Continua, a concatenar una cadena mutable con algún uso con formato cadena -appendFormat: , por ejemplo:

NSMutableString *imgString = [NSMutableString string];

for (int i=1; i<=NUMIMAGES; i++) {
    if (i > 1) [imgString appendString:@", "];
    [imgString appendFormat:@"image%d.jpg", i];
}

No estoy realmente seguro de lo que estás tratando de hacer, pero esto podría ser una inspiración:

NSMutableArray *fileNames = [NSMutableArray array];
for (int i=0; i<max; i++)
    [fileNames addObject:[NSString stringWithFormat:@"image%i.jpg", i]];

En cuanto a su error, que está utilizando la sintaxis con punto en el que no tiene ningún sentido. Además, no se utiliza el + a concatenar cadenas en Objective-C. Las miradas de sintaxis correctas appendString como esta:

NSMutableString *foo = [NSMutableString string];
[foo appendString:@"Hello, "];
[foo appendString:@"world!"];

Como se puede ver en la primera línea, es una buena idea para inicializar objetos antes de usarlos :) Para concatenar cadenas puede utilizar el método de appendString NSMutableString o puede crear una nueva cadena inmutable:

NSString *one = @"Hello, ";
NSString *two = [one stringByAppendingString:@"world!"];

Si usted tiene más cadenas a concatenar, se puede utilizar el inicializador stringWithFormat:

NSString *composed = [NSString stringWithFormat:@"%@, %@ %@!",
     @"Hello", @"Objective-C", @"world"];

Si todavía tiene la sensación de que Objective-C hace que ciertas cosas extremadamente difíciles es posible obtener alguna ventaja por el hecho que el aprendizaje;)

El código más simple, que hace lo que quiere sería algo como esto:

NSMutableString * string = [NSMutableString string];
for (int i = 1; i <= NUMIMAGES; i++) [string appendFormat: @"image%d.jpg", i];

Eso es todo. Como se puede ver, appendFormat: realmente hace las cosas un mucho más fácil! Pero no puedo averiguar por qué desea hacerlo. Usted obtendrá algo como:

"image1.jpgimage2.jpgimage3.jpgimage4.jpgimage5.jpg. . ."

¿Qué estás realmente tratando de lograr? David

descubrir todas las respuestas!
A veces se siente que uno tiene que ser un masoquista a ser competentes en Objective C !.
Se intentará de lo anterior, pero terminó utilizando

NSString *string1 = @"image"; 
NSString *string2; 
NSString *string3 = @".jpg"; 
NSString *incString; //*/ 

for(int i=1;i<=NUMIMAGES;i++)
{ 
 incString=[NSString stringWithFormat:@"%d",i]; 
 string2 = [string1 stringByAppendingString:incString]; 
 string3 = [string2 stringByAppendingString:string3]; 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top