我有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.
有人可以解释一下我做错了什么吗?
答案 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))