swift:在字符串中使用%s(格式:…)

swift:在字符串中使用%s(格式:…),swift,string,format,Swift,String,Format,我想用另一个字符串格式化一个字符串,如下所示: var str = "Hello, playground" print (String(format: "greetings %s", str)) 这导致了一个美丽的结果: 问候哰૧ 我用%@试过了,效果不错,但我从中得到了格式字符串 如果可能,我希望使用另一种编程语言%s标记。 有办法吗?解决方案1:更改格式 如果格式来自可靠的外部源,则可以将其转换为将出现的%s替换为%@: 因此,不是: String(format: "gre

我想用另一个字符串格式化一个字符串,如下所示:

var str = "Hello, playground"
print (String(format: "greetings %s", str))
这导致了一个美丽的结果:

问候哰૧

我用%@试过了,效果不错,但我从中得到了格式字符串 如果可能,我希望使用另一种编程语言%s标记。 有办法吗?

解决方案1:更改格式 如果格式来自可靠的外部源,则可以将其转换为将出现的
%s
替换为
%@

因此,不是:

String(format: "greetings %s", str)
String(format: "greetings %s", str)
你可以:

String(format: "greetings %s".replacingOccurrences(of: "%s", with: "%@"), str)
str.withCString {
    String(format: "greetings %s", $0)
}

解决方案2:更改字符串 ,一个简单的替换是不起作用的。例如:

  • 将说明符与数字字符序列一起使用时:
    %1$s
  • 使用“%”字符后跟“s”时:
    %%s
  • 使用宽度修改器时:
    %-10s
在类似的情况下,我们需要使用C字符串

因此,不是:

String(format: "greetings %s", str)
String(format: "greetings %s", str)
你可以:

String(format: "greetings %s".replacingOccurrences(of: "%s", with: "%@"), str)
str.withCString {
    String(format: "greetings %s", $0)
}

“%s”
格式说明符指定一个C字符串—以null结尾的字节序列。它也不能正确处理非ASCII/UTF-8编码。你不能在得到的格式字符串中搜索“%s”并用“%@”替换它吗?
%s
需要的是C字符串,而不是Swift字符串。为什么不直接使用
“问候语\(str)”
?我会尽可能避免字符串中的格式构造函数。%s转义不是为Objective-C或Swift字符串创建的,它仅用于C字符串。不惜任何代价避免本地化文本中的%s…有趣的是,Swift的创建者决定%s不应使用字符串。不确定这能带来什么好处?难道它不能以某种方式超载吗?