[Swift] ParseableFormatStyle の使い方

     
⌛️ 2 min.
WWDC21で導入された FormatStyle, ParseStrategy, ParseableFormatStyle を説明してみます。複数回に分けて説明します。今回は ParseableFormatStyle, ParseStrategy の使い方です。
FormatStyle, ParseableFormatStyle の 使い方/作り方を理解するための記事シリーズです。
[Swift] FormatStyle の使い方 [Swift] ParseableFormatStyle の使い方 [Swift] FormatStyle の作り方 [Swift] ParseableFormatStyle の作り方

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Ventura 13.2.1
  • Xcode 14.3 Beta
  • iOS 16.0

これまでの記事

前回の記事では、FormatStyle の使い方について説明しました。
・FormatStyle を使用すると データ を 適切な表現の String に変換できる
[Swift] FormatStyle の使い方

ParseableFormatStyle 位置付け

Objective-C ベースの Formatter には、 データ → 文字列 方向の変換だけでなく、文字列 → データ 方向の変換も可能でした。

FormatStyle は、上記のうちの データ → 文字列 方向の変換に該当します。

文字列 → データ 方向の変換を担当するのが、ParseableFormatStyle です。

名前も、Parse + able + FormatStyle で、走査できる FormatStyle と そのまま(?) です。

ParseableFormatStyle は、FormatStyle に conform した protocol です。

FormatInput/FormatOutput

なお、FormatStyle には、associatedType が2つ定義されています。
FormatInput : FormatStyle が入力として扱う型(上記で言う データの型)
FormatOutput: FormatStyle が出力する型 (上記で言う 文字列, i.e. String)

ParseableFormatStyle も 上記の associatedType を引き継いて使っています。

ParseStrategy

ParseableFormatStyle は、文字列 -> データ の変換を担当しますが、実際の変換自体は、ParseStrategy が担当しますので、まず、ParseStrategy をみてみます。

ParseStrategy にも、 associatedType として、ParseInput, ParseOutput が定義されています。

このとき、ParseableFormatStyle と ParseStrategy の関係は ParseableFormatStyle.FormatInput = ParseStrategy.ParseOutput であり、ParseableFormatStyle.FormatOutput = ParseStrategy.ParseInput であることことが必要です。

やりたいことは、Parse することなので、ParseStrategy の入力は、FormatStyle の出力の型と一致させ、ParseStrategy の出力は、FormatStyle の入力の型と一致させると言うことです。

例:Decimal.ParseStrategy

実際に、Foundation に定義されている ParseStrategy の1つ、Decimal.ParseStrategy をみてみます。

Apple のドキュメントは、こちら

Decimal.ParseStrategy は、ParseStrategy に conform している struct の1つです。

let dpStrategy = Decimal.ParseStrategy(format: .currency(code: "JPY"))

XCTAssertEqual(try XCTUnwrap(dpStrategy.parse("¥1,000")),
               1000)
XCTAssertThrowsError(try dpStrategy.parse("$1000"))

Decimal.ParseStrategy は、初期化時に、どのフォーマット (FormatStyle) をサポートするかを選択する必要があり、.currency(code:”JPY”) と指定しています。

こうすることで、日本の通貨記号である ¥ を含んだ文字列からも、Decimal(10進数) を取得できるようになります。
GroupingSeparator である , についても正しく処理できています。

日本円の記号でない $ 記号は、処理できず、エラーになります。(期待通りの結果です)

ParseableFormatStyle

ParseStrategy をみたので、あらためて、ParseableFormatStyle をみていきます。

Apple のドキュメントは、こちら

ParseableFormatStyle は、FormatStyle に conform した Protocol です。
ParseableFormatStyle として追加されているのは、以下の2つです。

var parseStrategy: Self.Strategy
associatedtype Strategy

実際に、上記の2つが、入力を出力に変換する処理を担当する要素です。

Strategy は、実際には、ParseStrategy という型で、先ほど見ました。

ですので、ParseableFormatStyle を使うことで、データ → 文字列 と 文字列 → データ の両方向の変換が実現されることになります。

ParseableFormatStyle に parse は、無い?

調べた範囲では、ParseableFormatStyle には、文字列 → データ という変換のためのメソッドは定義されていません。

FormatStyle には、formatted と言うメソッドが、データ → 文字列 という変換のために定義されていました。

ParseableFormatStyle を使って変換するためには、以下のように ParseableFormatStyle のプロパティ経由で ParseStrategy を使用することが必要です。

let dPFS = Decimal.FormatStyle.Currency(code: "JPY")
XCTAssertEqual(try XCTUnwrap(dPFS.parseStrategy.parse("¥1,000")),
               1000)

“Decimal.FormatStyle.Currency” は、Decimal が用意している Currency を処理するために用意した
ParseableFormatStyle をインスタンス化してしています。

Decimal のドキュメントこちらを辿っていくと、見つかります。

Decimal.FormatStyle は、FortmatStyle だけでなく ParseableFormatStyle にも conform していますが、各種データ型がどのような FormatStyle を用意しているかは個別に確認が必要です。

まとめ

ParseableFormatStyle を使った、表記からデータを読み取る方法を確認しました。

ParseableFormatStyle の使い方
  • 実際の読み取りは、ParseStrategy が行う
  • ParseableFormatStyle は ParseStrategy を parseStrategy プロパティとして持っている
  • Apple のドキュメントをよく読まないとどのような FormatStyle が用意されているかはよくわからない・・・

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

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