我在 swift 3 中有以下代码:
class StringUtility {
static func Localizer(tableName: String?) -> (_ key: String, _ params: CVarArg...) -> String {
return { (key: String, params: CVarArg...) in
let content = NSLocalizedString(key, tableName: tableName, comment: "")
if params.isEmpty {
return content
}
print(params) ->>>>>> this prints [[[Wells Fargo]]]
return NSString.init((format: content, arguments: getVaList(params))) as String
}
}
}
func localizationHelper(tableName: String, key: String, params: CVarArg...) -> String {
let t = StringResourceUtility.Localizer(tableName: tableName)
print(params) - >>>>>>>>>> this prints [[Wells Fargo]]
return t(key, params)
}
如果您看到上面两个函数中的打印语句,每次在函数内部传递 CVarArg 时都会附加 [],从而导致输出错误的本地化字符串。
1) CVarArg 不能像上面的代码那样被多次传递? 2) 如何解决这个问题?
最佳答案
你不能将可变参数列表传递给另一个函数,你
必须改为传递 CVaListPointer
。此外 withVaList
应该
代替 getVaList
使用:
class StringResourceUtility {
static func Localizer(tableName: String?) -> (_ key: String, _ params: CVaListPointer) -> String {
return { (key: String, params: CVaListPointer) in
let content = NSLocalizedString(key, tableName: tableName, comment: "")
return NSString(format: content, arguments: params) as String
}
}
}
func localizationHelper(tableName: String, key: String, params: CVarArg...) -> String {
let t = StringResourceUtility.Localizer(tableName: tableName)
return withVaList(params) { t(key, $0) }
}
例子:
let s = localizationHelper(tableName: "table", key: "%@ %@", params: "Wells", "Fargo")
print(s) // Wells Fargo
关于多次传递 CVarArg 的 swift 3 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428504/