Reputation: 1204
I have a simple problem. I tried search in many blogs about this question but all site return how function in swift work, but I need this case.
My custom function is:
func getLocalizeWithParams(args:CVarArgType...)->String {
return NSString.localizedStringWithFormat(self, args); //error: Expected expression in list of expressions
}
How I do to pass my args to other system function with args?
Thanks advance.
Upvotes: 19
Views: 8732
Reputation: 539685
Similar as in (Objective-)C, you cannot pass a variable argument list
directly to another function. You have to create a CVaListPointer
(the Swift equivalent of va_list
in C) and call a function which
takes a CVaListPointer
parameter.
So this could be what you are looking for:
extension String {
func getLocalizeWithParams(args : CVarArgType...) -> String {
return withVaList(args) {
NSString(format: self, locale: NSLocale.currentLocale(), arguments: $0)
} as String
}
}
withVaList()
creates a CVaListPointer
from the given argument list
and calls the closure with this pointer as argument.
Example (from the NSString
documentation):
let msg = "%@: %f\n".getLocalizeWithParams("Cost", 1234.56)
print(msg)
Output for US locale:
Cost: 1,234.560000
Output for German locale:
Cost: 1.234,560000
Update: As of Swift 3/4/5 one can pass the arguments to
String(format: String, locale: Locale?, arguments: [CVarArg])
directly:
extension String {
func getLocalizeWithParams(_ args : CVarArg...) -> String {
return String(format: self, locale: .current, arguments: args)
}
}
Upvotes: 26
Reputation: 331
I believe you're using NSString.localizedStringWithFormat(self, args)
incorrectly. Otherwise nothing wrong with using args to call another function.
If you look below, you need to specify the format as NSString as the first argument:
NSString.localizedStringWithFormat(format: NSString, args: CVarArgType...)
This SO question explains how to use it in Swift: iOS Swift and localizedStringWithFormat
Upvotes: -2