Как получить единицу измерения в виде существительного единственного числа?

#ios #swift #localization

Вопрос:

Я пытаюсь представить темп бега в своем приложении — скажем, 5 минут/км.

Для голоса за кадром я бы хотел, чтобы это было прочитано как пять минут на километр.

Я знаю, что могу пройти километры вот так:

 let measurementFormatter = MeasurementFormatter()
measurementFormatter.unitStyle = .long
measurementFormatter.string(from: UnitLength.kilometers)
 

но можно ли было бы получить форму единственного числа (и воспользоваться преимуществами уже локализованных единиц)?

Комментарии:

1. вы хотите TextToSpeech ??

2. вы имеете в виду 12 км/ч

3. @Sumit_VE Я хочу использовать этот текст для a11y и озвучки!

4. @LeoDabus обратите внимание, что это время/расстояние («темп»), а не расстояние/время («скорость»), но на самом деле это не имеет значения для того, о чем я спрашиваю.

5. Это имеет значение, так как я думаю, что есть встроенная скорость, которая даст вам «километры в час». Но я не думаю, что существует встроенное пространство единиц измерения, которое вы использовали бы для бега, например «минуты на километр».

Ответ №1:

Похоже, что единственным естественным способом сделать это было бы создать явное измерение и вручную удалить единственную единицу измерения («1»):

 let measurementFormatter = MeasurementFormatter()
measurementFormatter.unitStyle = .long
measurementFormatter.unitOptions = .providedUnit

let length: Measurement<UnitLength> = .init(value: 1, unit: .kilometers)
let str = measurementFormatter.string(from: length)
  .replacingOccurrences(of: "1", with: "")
  .replacingOccurrences(of: "  ", with: " ")
  .trimmingCharacters(in: .whitespaces)
 

Я не специалист по языкам, но я ожидаю, что это будет работать с большинством (если не со всеми) языками.

Комментарии:

1. Я думал о чем — то подобном-но я действительно хотел избежать этого .filter (или подобного). Спасибо за ваш ответ, хотя, скорее всего, я приму его, если больше ничего не всплывет!

2. @phi Согласился, что это не идеальное решение, однако вы можете создать свой собственный «тонкий» слой кэширования для строк такого рода, и вам нужно будет вычислить его только один раз.

Ответ №2:

Редактировать

Похоже, что можно создать пользовательский формат измерения, который выводится в минутах/км или минутах/миле. Смотрите учебник по адресу https://www.raywenderlich.com/553-how-to-make-an-app-like-runkeeper-part-1 для примера, как это сделать.

Комментарии:

1. Спасибо за ваш ответ! Я пытаюсь получить существительное в единственном числе «километр» (а не «километры»).

2. Так оно и есть. И вы используете UnitSpeed?