在iOS中查看模型验证

在上一篇文章中,我谈到了如何为iOS实现MVVM体系结构。 在这篇文章中,我将说明在将MVVM体系结构用于iOS应用程序时如何执行验证。

我们将在允许用户设置新密码的屏幕上工作。 下面的屏幕快照显示了屏幕的用户界面。

更改密码屏幕由“ ChangePasswordViewModel ”控制,该实现如下:

这是我们需要考虑的一些验证规则。

  • 密码长度至少为8个字符
  • 密码需要匹配

ChangePasswordTableViewController利用ChangePasswordViewModel为视图提供数据。 从文本字段到视图模型属性的方向绑定是在视图控制器内部设置的,如下所示:

每当您更改文本字段中的值时,视图模型就会自动更新,其中包含文本字段中的最新值。 现在,我们需要执行实际验证。 可以在保存操作内部的视图控制器中实现此操作,如下所示:

不要那样做!

您不希望视图控制器中包含验证逻辑。 这使得视图控制器的代码本来就不需要在这里膨胀。

解决此问题的一种方法是允许视图模型进行自我验证。

理想情况下,您将实现一个验证引擎类,其职责是验证视图模型。 验证引擎是自定义属性的偶像用例。 不幸的是,Swift当前不支持自定义属性。

每个坏规则将由以下实现的BrokenRule类表示:

ViewModel协议定义协议,该协议由brokenRules集合和isValid布尔属性组成。

ChangePasswordViewModel符合ViewModel协议并实现validate函数,如下所示:

验证功能执行所有验证。 同样,最好有一个单独的验证引擎类来执行所有与验证有关的任务。

isValid属性将重置规则集合,然后调用私有验证功能。 最后,它取决于破碎规则列表是否包含任何破坏的规则而返回true或false。

现在,视图控制器可以使用以下代码来验证视图模型:

让我们测试一下。 运行该应用程序,然后为新密码输入以下值并确认密码,然后尝试保存/更新密码。

新密码=保留空白

确认密码=保留空白

视图模型将无效,您将在输出窗口上看到以下消息。

  [Headlines.BrokenRule(propertyName:“ newPassword”,消息:“ Password应该至少包含8个字符”)) 

新密码= password123

确认密码= password345

  [Headlines.BrokenRule(属性名称:“ confirmPassword”,消息:“密码不匹配”))] 

我确实希望在Swift的未来版本中可以实现自定义属性。 使用自定义属性,我们的视图模型将如下所示简单:

显然,您仍然需要为“ Required”属性创建实现,但是我相信它将从视图模型中删除很多不必要的代码。 所有验证逻辑将移至ValidationEngine类,该类将根据修饰后的属性动态验证视图模型,并返回中断规则列表。

编程愉快!

您可以在此处下载代码:

azamsharp / HeadlinesMVVM
通过在GitHub上创建一个帐户为HeadlinesMVVM开发做出贡献。 github.com

另外,我有关Udemy的所有课程现在都在销售中。 您只需花10美元即可获得一门课程。 查看以下交易:

生日快乐-优惠券内有95%的折扣
大家好, medium.com