如何在C / Objective-C中跨越多行分割string文字?
我有一个很长的SQLite查询:
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";
我怎样才能把它分成几行以便阅读? 如果我做到以下几点:
const char *sql_query = "SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC";
我收到一个错误。
有没有办法在多行写查询?
有两种方法可以将string拆分为多行:
使用\
C中的所有行可以使用\分成多行。
平原C:
char *my_string = "Line 1 \ Line 2";
Objective-C的:
NSString *my_string = @"Line1 \ Line2";
更好的方法
有一个更好的方法适用于string。
平原C:
char *my_string = "Line 1 " "Line 2";
Objective-C的:
NSString *my_string = @"Line1 " "Line2"; // the second @ is optional
第二种方法更好,因为没有太多的空白。 但是,对于SQL查询,两者都是可能的。
注意:使用#define,你必须添加一个额外的'\'连接两个string:
平原C:
#define kMyString "Line 1"\ "Line 2"
你可以用预处理器做一个技巧。
它有潜在的缺陷,它会崩溃的空白,并可能会让人阅读代码混淆。
但是,它有好处,你不需要逃避里面的引号字符。
#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 );
预处理器将其变成:
const char *sql_query = "SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC";
当我编写一些包含JSON的大型文字string的unit testing时,我使用了这个技巧。 这意味着我不必逃避每一个引号字符“。
你也可以进入XCode – > Preferences,selectIndentation选项卡,然后打开Line Wrapping。
这样,你就不必再input任何东西了,它可以用于你已经写的东西。 🙂
一件烦人的事情是…
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 }
我一直有这个问题,所以我做了一个小工具来将文本转换为一个转义的多行Objective-Cstring:
http://multilineobjc.herokuapp.com/
希望这可以为你节省一些时间。
扩展Objective-C的引用思路:
#define NSStringMultiline(...) [[NSString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding] NSString *sql = NSStringMultiline( SELECT name, age FROM users WHERE loggedin = true );
你也可以这样做:
NSString * query = @"SELECT * FROM foo " @"WHERE " @"bar = 42 " @"AND baz = datetime() " @"ORDER BY fizbit ASC";
还有一个解决scheme,把你的.m文件改成.mm文件,使它成为Objective-C ++,并使用C ++原始文字,如下所示:
const char *sql_query = R"(SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC)";
原始文字忽略了一切,直到终止序列,在默认情况下是括号引用。 如果括号引用顺序必须出现在string的某处,那么也可以很容易地指定自定义终止符,查找C ++原始文字来查找这样做的细节(这很容易)。