我有一个简单的问题。我尝试在很多博客中搜索这个问题,但是所有网站都返回了快速工作中的功能,但我需要这个案例。
我的自定义功能是:
func getLocalizeWithParams(args:CVarArgType...)->String {
return NSString.localizedStringWithFormat(self, args); //error: Expected expression in list of expressions
}
如何使用args将我的args传递给其他系统函数?
谢谢你。
答案 0 :(得分:19)
与(Objective-)C类似,您无法传递变量参数列表
直接到另一个功能。你必须创建一个CVaListPointer
(Swift相当于C中的va_list
)并调用一个函数
采用CVaListPointer
参数。
所以这可能就是你要找的东西:
extension String {
func getLocalizeWithParams(args : CVarArgType...) -> String {
return withVaList(args) {
NSString(format: self, locale: NSLocale.currentLocale(), arguments: $0)
} as String
}
}
withVaList()
从给定的参数列表中创建CVaListPointer
并使用此指针作为参数调用闭包。
示例(来自NSString
文档):
let msg = "%@: %f\n".getLocalizeWithParams("Cost", 1234.56)
print(msg)
美国语言环境的输出:
Cost: 1,234.560000
德语区域设置的输出:
Cost: 1.234,560000
更新:从 Swift 3/4 开始,可以将参数传递给
String(format: String, locale: Locale?, arguments: [CVarArg])
直接:
extension String {
func getLocalizeWithParams(_ args : CVarArg...) -> String {
return String(format: self, locale: .current, arguments: args)
}
}
答案 1 :(得分:-1)
我相信您错误地使用了NSString.localizedStringWithFormat(self, args)
。使用args调用另一个函数没有任何问题。
如果你看下面,你需要指定格式为NSString作为第一个参数:
NSString.localizedStringWithFormat(format: NSString, args: CVarArgType...)
这个SO问题解释了如何在Swift中使用它:iOS Swift and localizedStringWithFormat