ultima tutorial objective logo español caracteristicas c objective-c

tutorial - objective c ultima version



¿Cómo dividir una cadena literal en varias líneas en C/Objective-C? (7)

Extendiendo la idea de la Quote para Objective-C:

#define NSStringMultiline(...) [[NSString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding] NSString *sql = NSStringMultiline( SELECT name, age FROM users WHERE loggedin = true );

Tengo una consulta sqlite bastante larga:

const char *sql_query = "SELECT statuses.word_id FROM lang1_words, statuses WHERE statuses.word_id = lang1_words.word_id ORDER BY lang1_words.word ASC";

¿Cómo puedo dividirlo en varias líneas para que sea más fácil de leer? Si hago lo siguiente:

const char *sql_query = "SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC";

Estoy recibiendo un error.

¿Hay una manera de escribir consultas en múltiples líneas?


Hay dos formas de dividir cadenas en varias líneas:

Utilizando /

Todas las líneas en C se pueden dividir en múltiples líneas usando /.

C simple:

char *my_string = "Line 1 / Line 2";

C objetivo:

NSString *my_string = @"Line1 / Line2";

Mejor enfoque

Hay un mejor enfoque que funciona solo para cuerdas.

C simple:

char *my_string = "Line 1 " "Line 2";

C objetivo:

NSString *my_string = @"Line1 " "Line2"; // the second @ is optional

El segundo enfoque es mejor, porque no hay mucho espacio en blanco incluido. Para una consulta SQL sin embargo, ambos son posibles.

NOTA: Con un #define, debe agregar un ''/' extra para concatenar las dos cadenas:

C simple:

#define kMyString "Line 1"/ "Line 2"


Hay un truco que puedes hacer con el preprocesador.
Tiene el potencial negativo de colapsar espacios en blanco, y podría ser confuso para las personas que leen el código.
Pero, tiene el lado positivo de que no necesitas escapar de los caracteres de comillas en su interior.

#define QUOTE(...) #__VA_ARGS__ const char *sql_query = QUOTE( SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC );

el preprocesador convierte esto en:

const char *sql_query = "SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC";

He usado este truco cuando estaba escribiendo algunas pruebas unitarias que tenían cadenas literales grandes que contenían JSON. Significaba que no tenía que escapar de cada carácter de comillas ".


También puede ingresar en XCode -> Preferencias, seleccionar la pestaña Sangría y activar el ajuste de línea.

De esa manera, no tendrás que escribir nada extra, y funcionará para las cosas que ya escribiste. :-)

Una cosa molesta aunque es ...

if (you''re long on indentation && short on windows) { then your code will end up squished against th e side li k e t h i s }


También puedes hacer:

NSString * query = @"SELECT * FROM foo " @"WHERE " @"bar = 42 " @"AND baz = datetime() " @"ORDER BY fizbit ASC";


Tengo este problema todo el tiempo, así que hice una pequeña herramienta para convertir texto en una cadena de Objective-C multilínea con escape:

http://multilineobjc.herokuapp.com/

Espero que esto te ahorre tiempo.


Una solución más para la pila, cambie su archivo .m a .mm para que se convierta en Objective-C ++ y use literales en bruto de C ++, como este:

const char *sql_query = R"(SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC)";

Los literales sin formato ignoran todo hasta la secuencia de terminación, que en el caso predeterminado es comillas entre paréntesis.

Si la secuencia de comillas entre paréntesis tiene que aparecer en la cadena en algún lugar, también puede especificar fácilmente un delimitador personalizado, como este:

const char *sql_query = R"T3RM!N8( SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC )T3RM!N8";