2010-04-14 16 views
5

Estoy trabajando a través de los podcasts de Stanford para iPhone y tengo algunas preguntas básicas.Sintaxis básica de Objective-C: "% @"?

El primero: ¿por qué no hay una fácil concatenación de cadenas? (¿O simplemente me lo pierdo?)

Necesitaba ayuda con el NSLog a continuación, y no tengo idea de lo que está haciendo actualmente (la parte% @). ¿Simplemente los sustituyes en donde necesites concatenación, y luego la coma separa los valores al final?

NSString *path = @"~"; 
NSString *absolutePath = [path stringByExpandingTildeInPath]; 

NSLog(@"My home folder is at '%@'", absolutePath); 

mientras que con cualquier otro lenguaje de programación que lo habría hecho así:

NSLog(@"My home folder is at " + absolutePath); 

Gracias! (Además, cualquier buena guía/referencia para alguien familiarizado con la sintaxis de estilo Java/C#/etc pasando a Objective-C?)

+1

¿por qué no hay una fácil concatenación de cadenas? '[@" foo "stringByAppendingString: @" bar "]'. Sí, en serio. También puede consultar los documentos de 'NSMutableString', que ayuda un poco. –

+0

¿De verdad crees que es "fácil" en comparación con "foo" + "barra"? ¿Pero es esa una mejor manera de hacerlo que el enfoque '% @' que tomé? – cksubs

+1

'stringByAppendingString' hace que la intención sea mucho más clara que la sobrecarga' + '. ¿O es '.' concatenar? En ese sentido, es más fácil que usar el operador sobrecargado incorrecto. Además, ¿qué pasaría si intentas agregar un entero a una cadena? P.ej. '" foo "+ 6'. ¿Qué tal si añades una cadena a un número entero? Usar 'stringByAppendingString' significa que no tengo que pensar en eso. Quizás no significa * más fácil * tanto como * perezoso *. – Duncan

Respuesta

13

%@ es un marcador de posición en una cadena de formato, para una instancia NSString.

Cuando haces algo como:

NSLog(@"My home folder is at '%@'", absolutePath); 

Usted está diciendo NSLog para reemplazar %@ marcador de posición con el valor de cadena rutaAbsoluta.

Del mismo modo, si se pone más marcadores de posición, puede especificar varios valores para sustituir a los marcadores de posición de la siguiente manera:

NSString *absolutePath = @"/home/whatever"; 
NSLog(@"My home #%d folder is at '%@'", 5, absolutePath); 

imprimirá:

Mi casa # 5 está en/home/lo que sea

Una manera fácil de hacer concatenación de cadenas:

NSString *s1 = @"Hello, "; 
NSString *s2 = @"world."; 
NSString *s = [NSString stringWithFormat:@"%@%@", s1, s2]; 
// s will be "Hello, world." 

No puede tener el signo + como un operador de concatenación de cadenas, ya que no hay sobrecarga de operación en Objective-C.

Espero que ayude.

+0

Genial, gracias por la explicación clara y simple. Para mi ejemplo, ¿sería mejor ("más objetivo, como C") hacerlo a través de un marcador de posición o por medio de una concatenación de cadenas? – cksubs

+2

Los especificadores de formato de cadena pueden imprimir otros tipos además de objetos Objective-C, como enteros ('% i'), dobles ('% f'), cadenas de caracteres C ('% s'), etc. No puede hacer esto con los operadores de concatenación. Los especificadores de formato de cadena provienen de C y se utilizan en funciones como 'printf()' para la salida. La sintaxis '% @' es una adición de Objective-C a los especificadores de formato de cadena C existentes que imprime el resultado del método '-description' de un objeto Objective-C. –

+0

Personalmente usaría marcadores de posición. Pero no está mal si lo haces con concatenación de cadenas ... :-) –

4

Eso es string format specifier. Básicamente le permite especificar un marcador de posición en la cadena y los valores que deben insertarse en el lugar del marcador de posición. El enlace que menciono arriba enumera las diferentes anotaciones para los marcadores de posición y el formato específico de cada marcador de posición.

Es como String.Format método de C# 's:

NSLog(String.Format("My home folder is at '{0}'", absolutePath)); 
2

Puede utilizar NSString +stringWithFormat hacer concatenación:

 
NSString* a = // ... 
NSString* b = // ... 
NSString* a_concatenated_with_b = [NSString stringWithFormat:@"%@%@",a,b]; 

La razón de la "% @" es que el formato de cadenas se basa apagado de la printf format strings syntax y se extiende. Estas funciones toman una cantidad variable de argumentos, y cualquier cosa que comience con un signo de porcentaje (%) se interpreta como un marcador de posición. Los caracteres siguientes determinan el tipo de marcador de posición.El printf estándar no usa "% @", y como "@" es el símbolo comúnmente utilizado para las cosas que Objective-C agrega al lenguaje C, tiene sentido que "@" simbolice "un objeto Objective-C" .

No hay concatenación automática utilizando el signo más (+), porque NSString * es un tipo de puntero, y Objective-C es un superconjunto estricto de C, por lo que, al agregar un objeto NSString *, se manipula el puntero . Objective-C no tiene ninguna función de sobrecarga del operador como en el lenguaje C++.

0

Además, %@ es bastante versátil, ya que en realidad inserta el resultado del método de descripción del argumento en la cadena de resultados. Para NSString, ese es el valor de la cadena, otras clases pueden proporcionar anulaciones útiles. Similar a toString en Java, por ejemplo.