Быстрая функция с args... переходите к другой функции с args

У меня простая проблема. Я попробовал поиск во многих блогах об этом вопросе, но все сайты возвращают функцию в быстрой работе, но мне нужен этот случай.

Моя пользовательская функция:

func getLocalizeWithParams(args:CVarArgType...)->String {
     return NSString.localizedStringWithFormat(self, args); //error: Expected expression in list of expressions
}

Как я могу передать свои аргументы другим системным функциям с помощью args?

Спасибо заранее.

Ответ 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)
    }
}

Ответ 2

Я считаю, что вы неправильно используете NSString.localizedStringWithFormat(self, args). В противном случае нет ничего плохого в использовании аргументов для вызова другой функции.

Если вы посмотрите ниже, вам нужно указать формат как NSString в качестве первого аргумента: NSString.localizedStringWithFormat(format: NSString, args: CVarArgType...)

Этот вопрос SO объясняет, как использовать его в Swift: iOS Swift и localizedStringWithFormat