问题修复
用 Swift FormatStyle…
在 iOS 15+ 代码中用 Foundation 的 FormatStyle / ParseableFormatStyle 替换旧 Formatter,实现类型安全、locale 感知的显示与解析。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Swift FormatStyle 通用
解决思路
- 先确定值的语义类型,以及输出是仅用于显示还是必须能往返解析。
- 选择最窄的内置 style,并保留用户当前 locale,除非协议格式明确要求其他 locale。
- 用代表性 locale(如 en_US、de_DE、ar_SA、ja_JP)渲染实际 UI。
- 检查分隔符、数字系统、日历、货币与单位约定、文字方向和布局。
- 若输出或解析失败,修正 style 或周边文案,恢复输入 fixture,并重跑同一 locale 矩阵。
- 新 iOS 15+ 代码优先用 FormatStyle,替代旧的 NumberFormatter、DateFormatter、DateComponentsFormatter 和手动插值。
- Duration 的 format style 和 URL.FormatStyle 需要 iOS 16+;Date.AnchoredRelativeFormatStyle 需要 iOS 18+,它相对固定锚点而非当前时刻格式化。
- 正常 UI 中省略 .locale(...),让 style 继承用户 locale;仅在明确的协议或测试 fixture 中使用固定 locale。
- 相对日期输出应作为独立文本,除非整句都围绕它本地化。
- 当用户编辑或导入已格式化值时,使用匹配的可解析 style,例如 Decimal.FormatStyle.Currency(code: "USD").locale(Locale(identifier: "en_US")),再用 try Decimal("$3,500.63", format: style) 解析、value.formatted(style) 显示。
- SwiftUI 中优先用 Text(_:format:),例如 Text(price, format: .currency(code: currencyCode))、Text(date, format: .dateTime.month().day().year())、Text(duration, format: .units(allowed: [.minutes, .seconds]))。
- 对每个面向用户且格式化的 Text,在 locale 矩阵下预览或测试实际屏幕;实时更新时间显示用 Text(.now, style: .timer)、Text(.now, style: .relative) 或 Text(timerInterval:),不要手动调度字符串刷新。
- 仅当内置组合无法表达领域约定时才创建自定义 FormatStyle;FormatStyle 遵循 Codable 和 Hashable,应保持为可复用值,仅在输入需往返时添加 ParseableFormatStyle。
- 自定义 style 仍需做 locale 和无障碍审查,紧凑的英文后缀未必适合所有 locale。
- 避免在视图代码中手动格式化或分配旧 formatter,改用匹配的 FormatStyle 和 Text(_:format:)。
- 不要硬编码货币符号或 locale,应传 ISO 货币代码并继承用户 locale,除非契约另有规定。
- 精确十进制输入不要用二进制浮点,应使用 Decimal.FormatStyle 及其匹配的解析策略。
- 不要假设 URL.formatted() 会保留所有组件,仅在需要显示时显式启用 .port(.always)、.query(.always) 或 .fragment(.always)。
- 不要把相对日期输出嵌入更大的句子,应保持独立或本地化整句。
- 散文式时长不要用 clock-style,应使用 .units(allowed:width:) 输出带标签的单位。
- 不要隐式处理测量单位转换,应选择适合 UI 的 usage:。
- 不要只做单 locale 抽查,应在代表性 locale 下运行同一实际屏幕 fixture,修复并重跑失败项。
适用边界 · 注意事项
- 需要 String Catalogs、复数、本地化文案、bundle 或 RTL 布局时,应交给 ios-localization;格式化本身即使无文本翻译也仍需 locale 审查。
- 仅做单 locale 抽查或未准备代表性 locale 矩阵时,不足以验证格式化输出。
- 当内置 FormatStyle 组合已能表达约定时,不应创建自定义 FormatStyle。