La generación de una lista de cadenas en Obj C [cerrado]
-
26-09-2019 - |
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
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
-
Agrega todas las imágenes en su proyecto de aplicación como recursos.
-
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];
}