【问题标题】:Basic Objective-C syntax: "%@"?基本的 Objective-C 语法:“%@”?
【发布时间】:2011-02-07 17:05:13
【问题描述】:

我正在研究斯坦福 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 的人来说,有什么好的指南/参考资料吗?)

【问题讨论】:

  • 为什么没有简单的字符串连接? [@"foo" stringByAppendingString:@"bar"]。对真的。您还可以查看NSMutableString 的文档,这会有所帮助。
  • 你真的认为与“foo”+“bar”相比“容易”吗?但这是否比我采用的 '%@' 方法更好?
  • stringByAppendingString 使意图比重载+ 更清晰。或者是. 连接?在这方面,它比使用错误的重载运算符更容易。此外,如果您尝试将整数附加到字符串会发生什么?例如。 "foo" + 6。将字符串附加到整数怎么样?使用stringByAppendingString 意味着我不必考虑它。也许您的意思不是 更容易,而是 更懒
  • stringByAppendingString 也更清楚地表明字符串是不可变的,使用“+”或“.”非常容易。在一个代码块中多次多次,并且幸福地不知道您正在创建的对象的数量。

标签: c objective-c syntax


【解决方案1】:

%@ 是格式字符串中的占位符,用于 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/whatever

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

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

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

希望对你有帮助。

【讨论】:

  • 酷,感谢您的清晰和简单的解释。对于我的示例,通过占位符还是通过字符串连接会更好(“更像客观的 C”)吗?
  • 字符串格式说明符可以打印除 Objective-C 对象之外的其他类型,例如整数 (%i)、双精度 (%f)、C 字符串 (%s) 等。您不能使用连接运算符执行此操作。字符串格式说明符来自 C,用于像 printf() 这样的函数用于输出。 %@ 语法是 Objective-C 对现有 C 字符串格式说明符的补充,用于打印 Objective-C 对象的 -description 方法的输出。
  • 我个人会使用占位符。但是如果你用字符串连接来做这件事并没有错... :-)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    就像C#的String.Format方法:

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

    【讨论】:

      【解决方案4】:

      您可以使用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++ 语言中的任何运算符重载功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多