Ответ 1
Как и в (Objective-) C, вы не можете передать список переменных аргументов
непосредственно к другой функции. Вы должны создать CVaListPointer
(Свифт эквивалент va_list
в C) и вызвать функцию, которая
принимает параметр 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/5 можно передавать аргументы
String(format: String, locale: Locale?, arguments: [CVarArg])
непосредственно:
extension String {
func getLocalizeWithParams(_ args : CVarArg...) -> String {
return String(format: self, locale: .current, arguments: args)
}
}