2016-03-04 4 views
0

Это похоже на главный вопрос, но я просто не могу найти ответ нигде :-(Я могу сделать это в Objective C, но я застрял в Swift.В Swift, как вставить форматированное значение Int в строку?

Что мне нужно сделать:

  1. Возьмет целочисленное значение
  2. формата его в локализованной строку
  3. Вводит значение в другую строку, используя stringWithFormat эквивалентный метод (так как другая строка локализована, а также, который не показан в упрощенных примерах ниже)

Как это легко сделать в Objective C - это работает:

// points is of type NSNumber * 

    NSNumberFormatter *formatter = [NSNumberFormatter new]; 
    formatter.locale    = [NSLocale currentLocale]; 
    formatter.numberStyle  = NSNumberFormatterDecimalStyle; 

    NSString *ptsString = [formatter stringFromNumber:points]; 
    NSString *message = [NSString stringWithFormat:@"You've earned %@ points", ptsString]; 

Моя лучшая попытка сделать это в Swift - ошибка компилятора в последней строке:

// points is of type Int 

    let formatter   = NSNumberFormatter() 
    formatter.locale  = NSLocale.currentLocale() 
    formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle 

    let ptsString = formatter.stringFromNumber(points)! 
    let message = String(format: "You've earned %@ points", arguments: ptsString) 

Я получаю следующую ошибку в Xcode на этой последней строке:

"Cannot convert value of type 'String' to expected argument type '[CVarArgType]'" 

(В моем фактическом коде сообщение, в которое я хочу вставить значение точек, тоже локализуется, но я упростил этот пример, так как я получаю точно такую ​​же ошибку в обоих случаях.)

Что мне здесь не хватает ..?

спасибо за любую помощь,

Erik

+0

Это действительно довольно простой. Пожалуйста, прочитайте главу [Строки и символы] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html) в Swift Language Guide, абзац String Interpolation – vadian

+0

Спасибо. Чтение сейчас ... –

+0

А, да, я знаю об этом. Я должен уточнить в своем вопросе, что я не могу использовать String Interpolation, потому что сообщение с% @ в нем фактически локализовано, переведено на 8 разных языках. –

ответ

6

Вам нужно обернуть аргументы в коллекции. Как это:

let message = String(format: "You've earned %@ points", arguments: [ptsString]) 

Вы также можете использовать этот метод:

let message = "You've earned \(ptsString) points" 

Кроме того, вы можете создать метод расширения, чтобы сделать это:

extension String { 
    func format(parameters: CVarArgType...) -> String { 
     return String(format: self, arguments: parameters) 
    } 
} 

Теперь вы можете сделать это:

let message = "You've earned %@ points".format("test") 
let message2params = "You've earned %@ points %@".format("test1", "test2") 
+0

А, спасибо! Действительно, обертка в сборнике устраняет проблему: 'String (format:« Вы заработали% @ points », arguments: [ptsString])'. Почему это необходимо в этом случае? Из других примеров, которые я видел в Интернете, я не видел '' и '' 'скобок вокруг переменной аргумента ... –

+1

Вам не нужно обертывать аргументы в массив, см. Комментарий Антона к вопросу. –

+0

Блестящий! Спасибо всем за супер быстрый ответ. Вау ... Большое спасибо! –

2

Иногда, вам нужно немного больше контроля - поэтому, если вам нужно иметь начальные нули, вы можете использовать «stringWithFormat» так же, как в Objective-C

let ptsString = String(format: "%02d", points)