如何正确使用VarArgs本地化string?

我有一个string扩展,可以帮助我国际化。

public extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } func localized(args:CVarArg...) -> String{ return NSString.localizedStringWithFormat(self.localized as NSString, args) as String } } 

这样,我可以轻松地使用“hello_world”.localized在应用程序的任何地方,它很好地工作。

现在我想拥有相同的function,但也希望能够传递参数。 然而通过'CVarArg …'似乎并不像我预期的那样工作。

"grant_gps_access".localized("MyApp")

预期结果: “请授予MyApp GPS接入权限”

实际结果: “请授予(\ n MyApp \ n)GPS接入”

我在这里错过了什么?

你不能将一个variables参数列表传递给另一个函数,你必须传递一个CVaListPointer (C中的va_list的Swift等价物):

 public extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } func localized(args: CVarArg...) -> String { return withVaList(args) { NSString(format: self.localized, locale: Locale.current, arguments: $0) as String } } } 

由于NSString.localizedStringWithFormat没有采用VAListPointer变体,因此使用与当前语言环境等价的NSString(format:, locale:, arguments:)

甚至更简单(归因于@OOPer):使用String.init(format:locale:arguments:) ,它需要一个[CVarArg]参数:

  func localized(args: CVarArg...) -> String { return String(format: self.localized, locale: Locale.current, arguments: args) } 

现在

 "grant_gps_access".localized(args: "MyApp") 

应该按预期工作,假定string文件包含条目

 "grant_gps_access" = "Please grant %@ GPS access";