【问题标题】:How long has NSString concatenation been supported?NSString 连接支持多久了?
【发布时间】:2015-09-07 11:11:29
【问题描述】:

我刚刚在我正在编辑的一些遗留代码中遇到了这一行:

[UIImage imageNamed:@"data/visuals/interface/" @"backgroundViewController"];
                                             ^^^^
                                   "Oops, what have I done here?"

我想我一定是不小心把一些东西粘贴到了错误的地方,但是 undo 并没有改变那行。出于好奇,我建立了这个程序,它成功了!

你知道吗? Obj-c 有一种更简洁的连接字符串文字的方式。

我添加了更多测试:

一个简单的日志

NSLog(@"data/visuals/interface/" @"backgroundViewController");

数据/视觉/界面/backgroundViewController

在参数中

NSURL *url = [NSURL URLWithString:@"http://" @"test.com" @"/path"];
NSLog(@"URL:%@", url);

网址:http://test.com/path

使用变量

NSString *s = @"string1";
NSString *s2 = @"string2";

NSLog(@"%@", s s2);

无法编译(对此并不感到惊讶)

其他字面量

NSNumber *number = @1 @2;

不编译


一些问题

  • 此字符串连接是否记录在任何地方?
  • 支持多久了?
  • 什么是底层实现?我希望它会是[s1 stringByAppendingString:s2]
  • 任何权威机构都将其视为良好做法吗?

【问题讨论】:

  • 请注意,您需要 %@ 为您尝试打印或连接的每个 NSString 所以 NSLog(@"%@ %@", s, s2);
  • @PabloA。你似乎有点错过了重点。这只是测试字符串 variables(与 literals 相对)是否可以以相同的方式连接。结果,预计不会编译。
  • 哦,抱歉,没有尝试给出解决方案,只是看到NSLog(@"%@", s s2);,我想添加该注释以防万一。
  • writing @"abc" @"def" 只是将常量加起来......所以它甚至可能不是像 stringByAppendingString 这样的任何方法调用......更多的是一个简单的编译器决定做出一个@ “abcdef”出来了……比想象中的“魔法”要少……
  • 至少 2014 年 1 月(来自我得到的旧经验测试)。但我不使用它。只是告诉你,这至少比那更老。

标签: ios objective-c string cocoa-touch concatenation


【解决方案1】:

这种连接静态NSStrings 的方法是一种编译时编译器功能,已经使用了十多年。它通常用于允许将长常量字符串拆分为多行。几十年来,“C”中已经提供了类似的功能。

C 编程语言一书,1988 年第二版,第 38 页描述了字符串连接,因此它已经存在了很长时间。

摘自本书:

可以在编译时连接字符串常量:

"hello," " world" is equivalent to "hello, world"

这对于在多个源代码行中输出长字符串很有用。

Objective-C 是“C”的严格超集,因此它一直支持“C”字符串连接,我猜是因为静态NSString 连接一直可用。

将静态字符串拆分为多行以提高可读性被认为是一种很好的做法。

【讨论】:

  • 呵呵,奇怪我从来没有遇到过。
  • 你对问题的其他部分有答案吗?
  • @James:回答您问题的一部分:连接发生在编译时,没有为它调用任何方法。如果您想将字符串拆分为多行而不在任何地方添加 \,这将非常有用。
  • WRT:问题的其他部分: 1. NSLog(@"%@", s s2); 不是编译时间,只是一个格式错误的语句。 2. NSNumber *number = @1 @2; NSNumbers 不是编译时代码,而是运行时代码,几年前才被添加到Objective-C中。
  • @zaph,谢谢,但我指的是最后的编号问题(您在编辑中已回答),而不是对我编写的测试的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
相关资源
最近更新 更多