自定义 FormatStyle

发布
更新
字数 321
阅读 2 分钟
阅读量 616

使用 FormStyle格式化文本非常方便,我们可以通过自定义 FormStyle 实现更多实用的格式化方法。

先看一下已有的 FormStyle 使用方法:

// 格式化日期
print(Date.now.formatted(.dateTime.month().year().day().minute().hour()))
// 2023年3月25日 19:45

注意上面的格式化顺序,会自动本地化,例如在英文化境下会 输出为 MMMM d, yyyy HH:mm的样式。

现在我们定义一个简单的 FormatStyle ,需求是:自动格式化容积为 ml。

// 定义一个数字格式化,配置小数的处理方式
extension NumberFormatter {
    static let volumeFormatter: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.maximumFractionDigits = 1
        formatter.minimumFractionDigits = 0
        return formatter
    }()
}

// 创建格式化风格
struct VolumeStyle: FormatStyle {
    // 格式化方法
    func format(_ value: Double) -> String {
        let formatter = NumberFormatter.volumeFormatter
        return "\(formatter.string(from: NSNumber(value: value)) ?? "0") ml"
    }
}

// 添加扩展
extension FormatStyle where Self == VolumeStyle {
    static var volume: VolumeStyle {
        return VolumeStyle()
    }
}

// 应用
1234.567.formatted(.volume)
// 1,234.57 ml

这是比较简单的方法,单位是硬编码的。为了转换单位、运算、比较等功能,可以创建一个 Volume 结构体,包含容积值和单位。

更多知识可以参考: WWDC 20 Formatter 让数据人性化:https://developer.apple.com/videos/play/wwdc2020/10160/ 自定义 format style:https://emptytheory.com/2021/08/14/creating-custom-parseable-format-styles-in-ios-15/