[Swift] FormatStyle の使い方 [Swift] ParseableFormatStyle の使い方 [Swift] FormatStyle の作り方 [Swift] ParseableFormatStyle の作り方
Sponsor Link
環境&対象
- 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 を使った、表記からデータを読み取る方法を確認しました。
- 実際の読み取りは、ParseStrategy が行う
- ParseableFormatStyle は ParseStrategy を parseStrategy プロパティとして持っている
- Apple のドキュメントをよく読まないとどのような FormatStyle が用意されているかはよくわからない・・・
説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。
SwiftUI おすすめ本
SwiftUI を理解するには、以下の本がおすすめです。
SwiftUI ViewMatery
SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。
英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。
View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。
超便利です
販売元のページは、こちらです。
SwiftUI 徹底入門
# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。
Swift学習におすすめの本
詳解Swift
Swift の学習には、詳解 Swift という書籍が、おすすめです。
著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。
最新版を購入するのがおすすめです。
現時点では、上記の Swift 5 に対応した第5版が最新版です。
Sponsor Link