WWDC2016のMeasurements and Units、まとめてみました。
こちらは、Foundationに追加された新機能になるので、新しいクラス・構造体の紹介と、
それらをどう組み合わせて使うかという話で全てになります。
新しいクラス・構造体は以下の通りです。
Measurement
04:00 - 05:30, 15:30 - 16:00
Measurementは、単位を伴う量を示すクラス・構造体です。
そのため、量を示すvalueと単位を表すunitをプロパティとして持ちます。

加減乗除についても、以下のスライドのように行うことができます。

Unit
05:30 - 06:30, 10:30-14:30
Unitは単位を表すクラスです。
Symbol、Dimension、Equivalenceをプロパティとして持つことができます。
それぞれの意味合いは次の通りです。
| プロパティ | 説明 | Required or Optional |
|---|---|---|
| Symbol | 単位に対応する文字列(m、km、ft...)。 | Required |
| Dimension | 単位系における次元。 | Optional |
| Equivalence | 他のDimensionへの変換 | Optional |
DimensionやEquivalenceがない単位はありうるため、Unitの定義は以下の通りになります。

Dimension
06:30 - 10:30, 14:30 - 15:30
Dimensionは単位系の次元を表すクラスです。
Dimensionクラスでは、基準となるDimensionが存在し、そこから各Dimensionへと変換するという考え方を採用しているため、基準となるDimensionであるbaseUnitと、そこからどう変換するかを示すためのconverterを引数として取って初期化を行います。

baseUnitが存在するため、以下のように同じ次元だが別の単位を計算する、といった場合には計算結果はbaseUnitに変換されます。

ちなみに、既に定義されているDimension一覧は下記の通りとなります。
面白いことに、Duration(時間)やLength(距離的な長さ)だけでなく、Illuminance(照度)やFuelEfficiency(燃費)といった、あまり一般的でない単位も定義されています。

MeasurementFormatter
16:00 - 21:30
単位のローカライズをきっちりやろうとすると、かなりタフな仕事になります。
というのも、表記上の単位をローカライズするだけではなく、文化圏に合わせた単位を選択する必要があるためです。
(以下の表では、アメリカのみポンドヤード法の影響でマイル表記となっている)

それを簡易化するために作られたクラスがMeasurementFormatterクラスになります。
これにMeasurementクラスのインスタンスを渡して処理することでローカライズされた適切な値を取得することができます。

また、UnitOptionsに適切な値を渡すことにより、出力結果の単位を様々な形に変更することもできます。

