Guest User

Untitled

a guest
Mar 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. import Foundation
  2.  
  3. // Playing around with MeasurementFormatter.string(from: Unit)
  4. let f = MeasurementFormatter()
  5. f.locale = Locale(identifier: "de_DE")
  6. f.unitOptions = .naturalScale
  7. f.unitStyle = .long
  8. f.string(from: UnitSpeed.milesPerHour)
  9. f.string(from: UnitTemperature.celsius)
  10.  
  11. // NSLocale exposes measurement system (Locale doesn't)
  12. Locale(identifier: "de_DE").usesMetricSystem
  13. NSLocale(localeIdentifier: "de_DE").object(forKey: .measurementSystem)
  14. NSLocale(localeIdentifier: "en_GB").object(forKey: .measurementSystem)
  15. NSLocale(localeIdentifier: "en_US").object(forKey: .measurementSystem)
  16.  
  17. enum MeasurementSystem: String {
  18. case metric = "Metric"
  19. case us = "U.S."
  20. case uk = "U.K."
  21. }
  22.  
  23. extension Locale {
  24. /// Type-safe variant of NSLocale.object(forKey: .measurementSystem)
  25. /// Returns .metric by default if an unknown measurement system is returned.
  26. var measurementSystem: MeasurementSystem {
  27. let ns = (self as NSLocale).object(forKey: .measurementSystem)
  28. guard let s = ns as? String, let m = MeasurementSystem(rawValue: s) else {
  29. assertionFailure("Locale \(self) has unknown measurement system: \(ns as Any)")
  30. return .metric
  31. }
  32. return m
  33. }
  34. }
  35.  
  36. extension UnitTemperature {
  37. static func preferredUnits(for locale: Locale) -> [UnitTemperature] {
  38. switch locale.measurementSystem {
  39. case .metric, .uk:
  40. return [.celsius]
  41. case .us:
  42. return [.fahrenheit]
  43. }
  44. }
  45. }
  46.  
  47. UnitTemperature.preferredUnits(for: Locale(identifier: "de_DE")).first?.symbol
  48. UnitTemperature.preferredUnits(for: Locale(identifier: "en_US")).first?.symbol
  49.  
  50. // I'd like to have a protocol-based version of the method, e.g.:
  51. //
  52. // protocol LocalizableUnit where Self: Unit {
  53. // static func preferredUnits(for locale: Locale) -> [Self]
  54. // }
  55. //
  56. // But that isn't compatible with Foundation's non-final unit classes. Pity.
  57.  
  58. extension UnitLength {
  59. static func preferredUnits(for locale: Locale) -> [UnitLength] {
  60. switch locale.measurementSystem {
  61. case .metric:
  62. return [.meters, .kilometers, .centimeters, .millimeters]
  63. case .us, .uk:
  64. return [.feet, .yards, .miles, .inches]
  65. }
  66. }
  67. }
  68.  
  69. let locales = [
  70. Locale(identifier: "de_DE"),
  71. Locale(identifier: "dk_DK"),
  72. Locale(identifier: "fr_FR"),
  73. Locale(identifier: "en_US")
  74. ]
  75. let unitsPerLocale = locales.map { locale -> [String] in
  76. let units = UnitLength.preferredUnits(for: locale)
  77. let formatter = MeasurementFormatter()
  78. formatter.locale = locale
  79. formatter.unitStyle = .long
  80. return units.map(formatter.string(from:))
  81. }
  82. print(unitsPerLocale)
Add Comment
Please, Sign In to add comment