2016-12-01 3 views
4

У меня есть расширение для струнногоSwift: проблемы с строкой форматирования

func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String { 
    return String(
    format: NSLocalizedString(
     self, 
     tableName: table, 
     bundle: bundle, 
     value: self, 
     comment: "" 
    ), 
    args 
) 
} 

Localizable.strings файл:

"%d seconds ago" = "%d seconds ago"; 

Использование:

print("%d seconds ago".localized(args: 5)) 
print(String.localizedStringWithFormat("%d seconds ago", 5)) 

И результат:

<some_random_number_here> seconds ago. 
5 seconds ago. 

Может кто-нибудь объяснить мне, что я делаю неправильно?

ответ

5

String имеет два одинаковых инициализаторами:

init(format: String, _ arguments: CVarArg...) 
init(format: String, arguments: [CVarArg]) 

Первый принимает переменное число аргументов, то второй один массив со всеми аргументами:

print(String(format: "x=%d, y=%d", 1, 2)) 
print(String(format: "x=%d, y=%d", arguments: [1, 2])) 

В вашем методе localized, args: CVarArg... представляет собой переменный параметр , и они доступны в корпусе функций как массив присвоенного типа, в данном случае [CVarArg]. Поэтому оно должно быть передано String(format: arguments:):

func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String { 
    return String(
    format: NSLocalizedString(
     self, 
     tableName: table, 
     bundle: bundle, 
     value: self, 
     comment: "" 
    ), 
    arguments: args // <--- HERE 
) 
} 

Смотрите также «VARIADIC Параметры» в "Functions" главе Swift ссылки.

0

Попробуйте это. args возвращает массив.

extension String { 
    func localized(table: String? = nil, bundle: Bundle = .main, args: CVarArg...) -> String { 
     return String(format: NSLocalizedString(self, tableName: table, bundle: bundle, value: self, comment: ""), args.first!) 
    } 
} 

print("%d hey!".localized(args: 5)) 

, если вы хотите установить более одного аргумента вы должны вызвать этот метод

(format: String, arguments: [CVarArg]) 

но вы должны добавить больше заполнителей

print("%d %d hey!".localized(args: 5, 7)) 
Смежные вопросы