自作アプリのDate→String変換をformatted()に置き換える

開発環境

> xcodebuild -version
Xcode 14.0
Build version 14A5228q

Xcodeはbetaだが本記事の内容はiOS16未満のAPIを使用。 本記事からXcode 14 beta 3。

モチベーション

tokizuoh.hatenablog.com

先日Sequenceのformatted()を試した時にDateもformatted()が使えるようになっていたので、自作アプリ(tokizuoh/contrail)で使ってみる。

Pull Request

github.com

今まで

今までのDate→String変換は以下のようなextensionを生やして使っていた。

import Foundation

extension Date {
    enum StringFormat {
        case yyyyMMddPd
    }

    func string(format: StringFormat) -> String {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .gregorian)

        switch format {
        case .yyyyMMddPd:
            formatter.dateFormat = "yyyy.MM.dd"
        }

        return formatter.string(from: self)
    }
}

let now = Date()
now.string(format: .yyyyMMddPd)
// -> 2022.07.12

こうした

let now = Date()
now.formatted(.dateTime.year().month(.twoDigits).day(.twoDigits)).replacingOccurrences(of: "/", with: ".")
// -> 2022.07.13

読みにくくなっていない?

記述量は多くなったが、パッと見でどういう変換がされるかが分かりやすくなった。 また、DateFormatterのインスタンスが変換毎に生成されなくなったのでメモリの観点でパフォーマンスは良くなってそう。

参考