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]
-
以上类型的所有可选型