为什么在将 %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@
位置语法)版本。
我有一个 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@
位置语法)版本。