Swift:字符串格式化的麻烦

时间:2016-12-01 15:55:44

标签: ios swift

我有String

的扩展名
func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String {
  return String(
    format: NSLocalizedString(
      self,
      tableName: table,
      bundle: bundle,
      value: self,
      comment: ""
    ),
    args
  )
}

Localizable.strings文件:

"%d seconds ago" = "%d seconds ago";

用法:

print("%d seconds ago".localized(args: 5))
print(String.localizedStringWithFormat("%d seconds ago", 5))

结果:

<some_random_number_here> seconds ago.
5 seconds ago.

有人可以解释一下我做错了什么吗?

2 个答案:

答案 0 :(得分:11)

String有两个类似的初始值设定项:

init(format: String, _ arguments: CVarArg...)
init(format: String, arguments: [CVarArg])

第一个采用不同数量的参数,第二个参数 包含所有参数的数组:

print(String(format: "x=%d, y=%d", 1, 2))
print(String(format: "x=%d, y=%d", arguments: [1, 2]))

localized方法中,args: CVarArg...可变参数 这些在函数体中作为数组提供 适当类型,在这种情况下[CVarArg]。 因此必须将其传递给String(format: arguments:)

func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String {
  return String(
    format: NSLocalizedString(
      self,
      tableName: table,
      bundle: bundle,
      value: self,
      comment: ""
    ),
    arguments: args   // <--- HERE
  )
}

另见"Functions"章节中的“可变参数” Swift参考。

答案 1 :(得分:0)

试试这样。 args返回一个数组。

extension String {
    func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String {
        return String(format: NSLocalizedString(self, tableName: table, bundle: bundle, value: self, comment: ""), args.first!)
    }
}

print("%d hey!".localized(args: 5))

如果要设置多个参数,则需要调用此方法

(format: String, arguments: [CVarArg])

但你应该添加更多占位符

 print("%d %d hey!".localized(args: 5, 7))