Swift中Locale.current与Locale(identifier: Locale.current.identifier)的区别
Swift 中
Locale.current 与同标识手动构造 Locale 实例的差异及适用场景 二者核心差异
- 动态更新能力不同
Locale.current是系统维护的全局动态实例,会实时响应系统区域设置的修改:比如用户切到系统设置修改了地区、时区、24小时制开关、历法类型后,切回App时Locale.current会自动更新为最新的配置。而通过Locale(identifier: Locale.current.identifier)构造的是静态实例,初始化完成后配置就固定为构造时刻的规则,后续系统设置变更不会对它产生任何影响。 - 配置完整性不同
Locale.current会完整同步用户的所有自定义区域配置:比如用户单独修改了周起始日、数字分组符号、历法类型,没有跟随所属地区的默认规则,这些自定义项都会在Locale.current中生效。而仅通过地区标识构造的实例,只会加载对应标识的官方默认标准配置,会忽略用户的自定义修改。举个实际例子:用户地区设为中国大陆(identifier为zh_CN),但手动把系统历法改成了佛历,此时Locale.current.calendar是佛历,而Locale(identifier: "zh_CN").calendar还是中国大陆默认的公历。 - 性能开销不同
Locale.current是系统全局缓存的单例,直接读取几乎没有额外性能开销。手动构造Locale实例每次初始化都需要解析地区标识、加载对应配置,单次开销很低但高频构造时会有累积损耗。
各自适用场景
- 优先使用
Locale.current的场景:- App界面需要展示和用户系统设置完全一致的格式化内容,比如日期、时间、货币、数字的展示
- 业务逻辑需要跟随用户系统设置实时变更,比如日历类应用的日期排版规则切换
- 优先使用
Locale(identifier:)(包括传入当前identifier的场景)的场景:- 需要固定格式化规则的业务场景,比如传给后端接口的日期、数字参数,不能因为用户修改了系统设置就变更格式
- 内容导出、归档等需要统一格式的场景,要求所有用户的导出内容都使用同一套标准规则,不受用户自定义设置影响
- 国际化预览、多地区格式对比等开发调试场景
内容的提问来源于stack exchange,提问作者XY2709
相关产品推荐
相关产品推荐

