【发布时间】:2021-09-24 09:42:09
【问题描述】:
最近在firebase crashlytics中我们发现了以下问题:
let a = "1-> %@" // Strings are located in Localized.strings, we already know them
let b = "1-> %@, 2-> %@"
let aStr = String(format: a, "hello") // Works fine
let bStr = String(format: b, "hello") // Run time error on certain machine (M1, physical device)
看起来当将较少的可变参数传递给String(format:) 时,您会在 M1 和物理设备上遇到运行时崩溃。
我想知道是否有任何方法可以避免来自 localised.strings 的字符串出现这些运行时错误。
最好在编译时捕捉到这一点。 您将如何面对这个问题?
【问题讨论】:
-
由于格式来自
localized.strings,您应该更改代码示例以使其看起来尽可能接近您的实际代码(即localizedStringWithFormat、NSLocalizedString和所有这些好东西)。我认为没有办法单独使用编译器来检查这一点,但是编译器 + 像plutil -lint这样的工具 + 一些自定义脚本可能会提供解决方案。 -
@SergeyKalinichenko 我基本上在想代码生成可能是一个解决方案。对于每个格式字符串,它将生成一个具有确切数量参数的函数(避免使用可变参数)。但是我们遇到了不同语言的问题。但是我们可以为不同的语言创建不同的方法。
-
我认为布拉德利的回答为您提供了一个很好的解决方案模板。也许您会在这里和那里对其进行优化,但是构建自己的功能以“领先”本地化过程的想法是正确的想法。也许您可以推送更多参数而不是断言,以显示问号来代替未知参数,但总体方法对我来说看起来很可靠。
-
这是不使用
String(format:)的一个很好的理由。据我所知,在现代 Swift 中,没有真正的理由来称呼它。 -
@matt 那么应该用什么代替呢?
标签: ios swift string-formatting apple-m1