Swift Compare the values of the properties
问题
在做表单填写/编辑的功能开发时, 总会遇到类似这样的需求: 当用户正在编辑时,点击了返回按钮, 这时就需要代码判断当前用户有没有更改过表单内容, 如果更改了则需要提示用户当前编辑内容未保存, 是否确定返回; 如果未更改则可以返回上个页面.
在iOS开发中, 这些页面的数据通常会保存在Model
里, 如果实现上述的需求就需要对比Model
中的属性值是否发生了改变.
功能实现
为了能够复用代码, 我把上述功能封装成了一个协议, 并且自定义了一个运算符=*=
, 能够轻松的对比两个同类型的Model
的属性值是否全部相同.
使用步骤
- 遵循协议(
EquatableProperty
) - 使用运算符(
=*=
)进行比较
举个例子🌰
class SuperClassStr: EquatableProperty {
var propertyStr: String = ""
var propertyStrOpt: String?
var subClass: SubClass!
}
class SubClass: EquatableProperty {
var propertyInt: Int = 0
var propertyIntOpt: Int?
}
let strClass1 = SuperClassStr()
let strClass2 = SuperClassStr()
strClass1.propertyStr = "test123"
strClass2.propertyStr = "test123"
let subClass1 = SubClass()
subClass1.propertyInt = 1
let subClass2 = SubClass()
subClass2.propertyInt = 15
strClass1.subClass = subClass1
strClass2.subClass = subClass2
let isEqual = strClass1 =*= strClass2
print("isEqual = \(isEqual)")
注: 如果实例对象中包含的是其他类类型的属性, 则只需要该类也遵循
EquatableProperty
协议, 即可自动比较该类中的属性值.
支持类型如下
class
struct
Int
Bool
Double
Float
String
NSNumber
[Int]
[Bool]
[Double]
[Float]
[String]
[NSNumber]
[String: Int]
[String: Bool]
[String: Double]
[String: Float]
[String: String]
[String: NSNumber]
以上类型的所有可选型
源码地址
联系我:
- 博客: http://yuqiangcoder.com/
- 邮箱: yuqiang.coder@gmail.com