Class 比较Swift中对象的两个实例
给定以下类,如何比较两个实例中的所有值Class 比较Swift中对象的两个实例,class,swift,object,comparison,Class,Swift,Object,Comparison,给定以下类,如何比较两个实例中的所有值 // Client Object // class PLClient { var name = String() var id = String() var email = String() var mobile = String() var companyId = String() var companyName = String() convenience init (copyFrom: PLC
// Client Object
//
class PLClient {
var name = String()
var id = String()
var email = String()
var mobile = String()
var companyId = String()
var companyName = String()
convenience init (copyFrom: PLClient) {
self.init()
self.name = copyFrom.name
self.email = copyFrom.email
self.mobile = copyFrom.mobile
self.companyId = copyFrom.companyId
self.companyName = copyFrom.companyName
}
}
var clientOne = PLClient()
var clientTwo = PLClient(copyFrom: clientOne)
if clientOne == clientTwo { // Binary operator "==" cannot be applied to two PLClient operands
println("No changes made")
} else {
println("Changes made. Updating server.")
}
这种情况的用例是在一个从服务器提供数据的应用程序中。将数据转换为对象后,将创建对象的副本。用户可以编辑各种字段等。。这将更改其中一个对象中的值
可能已更新的主对象需要与该对象的副本进行比较。如果对象相等(所有属性的值都相同),则什么也不会发生。如果任何值不相等,则应用程序将更改提交给服务器
如代码示例所示,由于未指定值,因此不接受
=
运算符。使用==
将无法获得所需的结果,因为它们始终是两个独立的实例。表示您的类符合equalable协议,然后实现==运算符
大概是这样的:
class PLClient: Equatable
{
var name = String()
var id = String()
var email = String()
var mobile = String()
var companyId = String()
var companyName = String()
//The rest of your class code goes here
public static func ==(lhs: PLClient, rhs: PLClient) -> Bool{
return
lhs.name == rhs.name &&
lhs.id == rhs.id &&
lhs.email == rhs.email &&
lhs.mobile == rhs.mobile &&
lhs.companyId == rhs.companyId &&
lhs.companyName == rhs.companyName
}
}
根据Duncan C的答案,我提出了一个替代方案,该方案更清楚地表明它是以定制方式使用的:
// Client Object
//
class PLClient {
var name = String()
var id = String()
var email = String()
var mobile = String()
var companyId = String()
var companyName = String()
convenience init (copyFrom: PLClient) {
self.init()
self.name = copyFrom.name
self.email = copyFrom.email
self.mobile = copyFrom.mobile
self.companyId = copyFrom.companyId
self.companyName = copyFrom.companyName
}
func equals (compareTo:PLClient) -> Bool {
return
self.name == compareTo.name &&
self.email == compareTo.email &&
self.mobile == compareTo.mobile
}
}
var clientOne = PLClient()
var clientTwo = PLClient(copyFrom: clientOne)
if clientOne.equals(clientTwo) {
println("No changes made")
} else {
println("Changes made. Updating server.")
}
您可以使用
keypath
我还没有测试过这个,但总的想法是存在的。给出一个有效字段的列表,并循环遍历它们,而不是编写每个等式。因此,它与@duncan-c建议的相同,但有循环
比如:
class PLClient:可均衡{
var name=String()
var id=String()
var email=String()
var mobile=String()
var companyId=String()
var companyName=String()
公共静态func==(lhs:PLClient,rhs:PLClient)->Bool{
let keys:[KeyPath]=[\.name、\.id、\.email、\.mobile、\.companyId、\.companyName]
return keys.all满足{lhs[keyPath:$0]==rhs[keyPath:$0]}
}
}
重载==
为您的类。通过遵守是否有理由编写具有等效签名“isEqualTo:”的比较器方法?在Swift中,实现相等性测试的正确方法是使类或结构符合相等协议。我看不出有任何理由实现诸如“isEqualTo:”之类的函数,特别是因为该类稍后可以扩展以符合平等协议,然后有两个可能不同的平等测试。此外,“isEqualTo:”方法可以被子类重写。这将是一件坏事,因为它打破了“a的子类是a”的规则。Equality protocol==函数不能被子类重写。总的来说,我不同意这个建议。equalable协议旨在允许对对象进行相等性比较。通过使类符合equalable协议,您使用的是标准方法进行比较。使用自定义的“isEqualTo”方法是非标准的,会使事情变得不那么清楚,而不是更清楚。如果这些属性中的一个或两个是可选的,那么最好的比较方法是什么?例如如果name:String?