Swift3中基于MVVM的Model校验及Model初始化方法咨询
Swift3中MVVM模式下Model校验与初始化解决方案
嘿,我来帮你梳理下这两个问题的具体解决方案:
一、MVVM模式下的Model校验思路
在MVVM架构里,Model层应该是数据校验的核心载体,毕竟它最清楚自己需要什么样的数据;ViewModel则负责把校验结果转化为View能直接使用的状态(比如错误提示)。具体可以这么做:
- Model自身做基础校验:利用Swift的可失败初始化器(
init?)来校验必填字段的存在性和类型正确性,就像你写的CartModel那样。如果需要更严格的校验(比如餐厅名称不能是空字符串、长度至少2个字符),可以在初始化器里补充逻辑:
class CartModel: NSObject { var restaurantname :String! init?(dictionary :JSONDictionary) { guard let name = dictionary["name"] as? String, !name.isEmpty, name.count >= 2 else { // 任何条件不满足就返回nil,初始化失败 return nil } self.restaurantname = name } }
- ViewModel处理校验反馈:当Model初始化失败时,ViewModel可以捕获这个结果,生成用户友好的提示信息或者状态标记,传递给View层展示。比如你可以在ViewModel里加一个
errorMessage属性,当发现无效数据时赋值,让View显示给用户。
二、Model初始化方法&ViewModel代码修正
1. CartModel的初始化
你的CartModel用了可失败初始化器,需要传入一个JSONDictionary类型的字典(这里默认JSONDictionary是typealias JSONDictionary = [String: Any]的别名)。初始化的时候只要传入符合格式的字典就行,比如从网络接口返回的JSON解析后的字典,或者本地构造的测试数据:
// 示例:构造测试数据初始化CartModel let testRestaurantData: JSONDictionary = ["name": "肯德基"] if let validCartModel = CartModel(dictionary: testRestaurantData) { // 初始化成功,拿到可用的CartModel实例 print("餐厅名称:\(validCartModel.restaurantname)") } else { // 初始化失败,说明数据不符合要求,做错误处理 print("数据错误:餐厅名称格式不正确") }
2. ViewModel代码修正
看你的ViewModel代码,有几个小细节需要调整,还有一些缺失的部分我帮你补全了:
// 先补全ChartDataSourceModel的定义(假设它是管理CartModel数组的数据源模型) class ChartDataSourceModel: NSObject { var cartItems: [CartModel] = [] init(cartItems: [CartModel]) { self.cartItems = cartItems super.init() } } // 修正后的ChartViewModel class ChartViewModel: NSObject { var datasourceModel: ChartDataSourceModel init(withdatasource newDatasourceModel: ChartDataSourceModel) { self.datasourceModel = newDatasourceModel super.init() // NSObject子类初始化必须调用super.init() } func datafordisplay(atindex indexPath: IndexPath) -> CartModel? { // 安全校验:防止indexPath.row超出数组范围,避免崩溃 guard indexPath.row < datasourceModel.cartItems.count else { return nil } return datasourceModel.cartItems[indexPath.row] } }
内容的提问来源于stack exchange,提问作者robbieroberts
相关产品推荐
相关产品推荐

