为什么在将 %1$s 用于 String(format:) 时得到 EXC_BAD_ACCESS

Why do I get EXC_BAD_ACCESS when using %1$s for String(format:)

我有一个 localized string 看起来像这样:

String(format: "unable_to_reach".localized(), name) //name is a string. I have also tried just "x"

localize 文件中的 key/value 对如下所示:

"unable_to_reach" = "Unable to reach %1$s";

现在,有时 这行得通,有时它会因 EXC_BAD_ACCESS 错误而崩溃。为什么是这样? %1$s 不是应该用于 string 值吗?

格式说明符 %1$s%s,其中插入了位置说明符 </code>。 <code>%s 是空终止 C 字符串的格式说明符。如果您改为将 Swift 字符串传递给它,就会发生不好的事情。不要那样做。 (如果 Swift 字符串不包含任何空字节,可能会导致缓冲区溢出。)

您需要 %@(或 %@,以保留位置说明符。)

有关详细信息,请参阅 string format specifiers 上的文档。

编辑:

顺便说一句,你应该考虑使用 Swift 字符串插值来代替:

let unableToReach = "unable_to_reach".localized()
let final = "\(unableToReach) \(name)"

那更像是“Swifty”。

请注意,如果您想使用本地化占位符以允许不同语言的不同词序,您确实仍然需要使用 String(format:)%@(或 %1@ 位置语法)版本。