iOS(Swift)中DateFormatter应归属ViewModel、Model还是Controller?
嘿,这个问题问到点子上了!在iOS(Swift)的MVVM架构里,DateFormatter其实并不严格属于ViewModel、Model或者Controller中的某一层——它本质是一个通用的格式化工具类,我们会根据实际使用场景来灵活安排它的位置,核心原则是复用性和解耦。
常见的放置方式和场景
单独抽成工具类(最推荐):由于
DateFormatter的创建成本不低,重复创建会浪费性能,所以大多数项目会把它封装成单例工具类(比如DateFormatterHelper或者DateUtils),让各个层都可以按需调用。比如你可以创建包含各种常用格式的Formatter:class DateFormatterHelper { static let shared = DateFormatterHelper() // 解析服务器返回的ISO8601格式时间 let isoFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }() // 给用户展示的友好格式(比如"2024-05-20 14:30") let displayFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .medium formatter.timeStyle = .short formatter.locale = Locale.current return formatter }() private init() {} // 禁止外部实例化 }这种方式下,Model可以用它解析网络数据,ViewModel可以用它生成给View展示的字符串,完全解耦,还能避免重复创建的性能问题。
Model层辅助工具:如果你的Model需要把服务器返回的时间字符串直接转成
Date类型,也可以把DateFormatter的实例放在Model的扩展或者内部作为静态属性,专门用于数据解析。不过要注意尽量复用,不要每次初始化Model都创建新的Formatter。ViewModel层内部使用:当ViewModel需要处理日期的展示逻辑(比如把
Date转成“3分钟前”、“昨天”这类相对时间),可以在ViewModel里直接调用全局的工具类Formatter,或者在ViewModel内部创建专用的Formatter(但同样要注意复用)。这里ViewModel负责业务逻辑处理,把格式化好的字符串传给View展示,符合MVVM的职责划分。
避坑提醒
尽量别让DateFormatter出现在Controller层里!Controller的职责是协调View和ViewModel,处理页面跳转、生命周期事件这类事情,把日期格式化逻辑放在Controller里会让它变得臃肿,也不符合MVVM的单一职责原则。
总的来说,DateFormatter的核心是工具属性,不需要硬套到某一层里,重点是让它复用性强、和业务逻辑解耦就好。
内容的提问来源于stack exchange,提问作者Vivek Gupta

