[Measurement] MeasurementとSwiftUIを使って、UnitConverterを作る件~MeasurementとMeasurementFormatterをうまく使う方法

Swift

Measurementで、単位間の変換が簡単になることが理解できたので、ず〜〜〜っと昔にチュートリアルで作った単位変換アプリを作ろうとしたのですが、思わぬところに難しさがありました。
忘備録も兼ねて、Measurement の使い方について改めて説明します。

Step1: Measurementを使って表現

Measurementを使うことで、Celsius/摂氏とFahrenheit/華氏の変換が簡単になることを試したいので、使います。

SwiftUIを使うので、複数のTextFieldで共有することを考えて、@Stateを使い定義します。

@StateとMeasurementを使って温度を定義

Measurementを使うことで、例えば、華氏での値が欲しければ、

摂氏から華氏への変換例

とすることで、華氏での値を取得することができます。

ここまでは、非常にわかりやすいです。




Step2: UIレイアウト

UIは、タイトルを一番上に配置して、その後、TextFieldを縦に並べることとしました。(摂氏、華氏だけでなく、ケルビン/Kでも表示してみました)

SwiftUIでのUI定義

TextFieldを配置するところに難しさはありません。

ただ、TextFieldで値を表示するためのformatterでハマりました。

MeasurementFormatterを使うのが定石だと思うのですが、単位を指定して表示させるMeasurementFormatterがありません・・・😓

Localeに合わせて自動で表示してくれるのは非常に便利ですが、こういう時に困ることがわかりました。

Step3: MeasurementFormatterを拡張

なければ、作ってしまえということで以下のようなMeasurementForamtterの拡張版を作りました。表示する単位を指定することができます。

# 温度に使用するUnitTemperatureをうまく、Generics的に扱えませんでした・・・orz 今後の課題とします。

以下のようなGerericsを使ったクラスを作成しました。

# さらに、元々のUnitを使ったMeasurementを返すように改善しました。

MeasurementFormatterWithDisplayUnit

記録のために、以下のGenericsでないバージョンも残しておきます。対応Dimensionごとに作る必要があります。

# クイックハック感が強いですが、その通りです。

MeasurementFormatterを継承したクラス定義




Step4: 完成したUnitConverter

最終コード




Step5: まとめ

当初、UnitConverterが10行くらいで作れます とかになると思いましたが、変換そのものではなく、表示でハマりました。

ただ、このアプリがあくまで練習用のアプリということでの特殊なシチュエーションな気もします。

説明は以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です