Неиспользуемый позиционный аргумент пропущен при форматировании строки (Swift) - PullRequest
1 голос
/ 08 мая 2020

Я хочу отформатировать строку в Swift с двумя потенциальными аргументами (используя спецификаторы формата ). Строка для форматирования может иметь место только для первого аргумента, только для второго аргумента или для обоих аргументов. Если я использую первый или оба аргумента, он работает, но если я использую только второй аргумент, он не работает. Например:

let title = "M."
let name = "David"
let greetingFormat = "Hello %1$@ %2$@"
print(String(format: greetingFormat, title, name))
// OUTPUT> Hello M. David
// OK

Если я использую только первый аргумент в строке для форматирования:

let greetingFormat = "Hello %1$@"
print(String(format: greetingFormat, title, name))
// OUTPUT> Hello M.
// OK

Но при использовании только второго аргумента

let greetingFormat = "Hello %2$@"
print(String(format: greetingFormat, title, name))
// OUTPUT> Hello M.
// NOT THE EXPECTED RESULT!

В последнем случае я ожидал «Привет, Дэвид». Это ошибка? Как я могу получить ожидаемый результат для последнего случая, когда используется только второй аргумент?

Примечания:

  • Обратите внимание, что эта проблема возникает в контексте локализации (т.е. строка для форматирования поступает из файла Localizable.strings), поэтому у меня нет возможности напрямую удалить неиспользуемый аргумент.
  • Вопрос не относится к форматированию имени человека. Это просто для примера.

1 Ответ

1 голос
/ 08 мая 2020

Я отвечаю на свой вопрос, но все благодарны @ Martin R , который предоставляет соответствующую информацию в комментариях.

  • Это не ошибка, String(format:) не поддерживает опускание позиционных параметров.
  • Это известное поведение, начиная с Objective C, см .: stackoverflow.com / a / 2946880/1187415
  • Если у вас есть только аргументы String, вы можете использовать несколько замен String с String.replacingOccurrences(of:, with:) вместо String(format:).

Больше точности по последнему решению. Следующее будет работать в случае, если используется только один аргумент, а также если оба аргумента используются в строке greetingFormat:

greetingFormat.replacingOccurrences(
    of: "%1$@", with: title)
    .replacingOccurrences(
    of: "%2$@", with: name)

Конечно, с String.replacingOccurrences(of:, with:) вы можете выбрать другие идентификаторы для замена чем %1$@ и %2$@.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...