基本Objective-C语法:“%@”?

时间:2010-04-14 00:19:09

标签: c objective-c syntax

我正在浏览斯坦福iPhone播客并提出一些基本问题。

第一个:为什么没有简单的字符串连接? (或者我只是错过了吗?)

我需要帮助下面的NSLog,并且不知道它目前在做什么(%@部分)。您是否只需将那些替换为需要连接的地方,然后用逗号分隔最后的值?

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

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

而对于任何其他编程语言,我都是这样做的:

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

谢谢! (另外,熟悉Java / C#/ etc样式语法过渡到Objective-C的人有什么好的指南/参考资料吗?)

4 个答案:

答案 0 :(得分:13)

%@是格式字符串中的占位符,用于NSString实例。

当您执行以下操作时:

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

您告诉NSLog使用名为absolutePath的字符串替换%@占位符。

同样,如果您放置更多占位符,则可以指定更多值来替换这些占位符:

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

将打印:

  

我的家#5在/ home / what

进行字符串连接的简便方法:

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

您不能将+符号作为字符串连接运算符,因为Objective-C中没有运算符重载。

希望它有所帮助。

答案 1 :(得分:4)

那是string format specifier。基本上,它允许您在字符串中指定占位符以及要插入占位符位置的值。我在上面引用的链接列出了占位符和每个占位符的特定格式的不同符号。

就像C#的String.Format方法:

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

答案 2 :(得分:2)

您可以使用NSString +stringWithFormat进行连接:

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

“%@”的原因是字符串格式化基于并扩展了printf format strings syntax。这些函数采用可变数量的参数,以百分号(%)开头的任何内容都被解释为占位符。后续字符确定占位符的类型。标准printf不使用“%@”,并且由于“@”是Objective-C添加到C语言中的常用符号,因此“@”将符号化“Objective-C对象”

没有使用加号(+)的自动连接,因为NSString *是指针类型,而Objective-C是C的严格超集,因此,添加到NSString *对象会执行指针操作。 Objective-C没有像C ++语言那样的任何运算符重载功能。

答案 3 :(得分:0)

此外,%@相当通用,因为它实际上将参数的描述方法的结果插入到结果字符串中。对于NSString,这是字符串的值,其他类可以提供有用的覆盖。例如,与Java中的toString类似。