Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 比较Swift中对象的两个实例_Class_Swift_Object_Comparison - Fatal编程技术网

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?