Ios 如何比较两个Struct对象?

Ios 如何比较两个Struct对象?,ios,swift,Ios,Swift,对于同一个struct类,我有两个具有不同值的对象。我需要比较这两个物体是否相等。请给我一个合适的解决方案 struct CustomerInfo { var billAddressCity: String? init(a:String?){ billAddressCity = a } } /* init object */ var obj1 = CustomerInfo? var obj2 = CustomerInfo? obj1 = Custo

对于同一个struct类,我有两个具有不同值的对象。我需要比较这两个物体是否相等。请给我一个合适的解决方案

struct CustomerInfo {
   var billAddressCity: String?

   init(a:String?){
      billAddressCity = a

  }
}

 /* init object */
 var obj1 =  CustomerInfo?
 var obj2 =  CustomerInfo?

 obj1 = CustomerInfo(a: "ONE")
 obj2 = CustomerInfo(a: "TWO")

 /*  I need to compare these two objects */

 if obj1 == obj2 {
     Print(equal values)
  }
这不是我想要的答案,因为它说我需要手动比较每个字段的值,

通过遵守
同等标准

struct CustomerInfo: Equatable {
    var billAddressCity: String?

    init(a:String?){
        billAddressCity = a
    }

    static func ==(lhs: CustomerInfo, rhs: CustomerInfo) -> Bool {
        return (lhs.billAddressCity == rhs.billAddressCity)
    }
}

在面向对象的世界中,一般来说,所有对象都是彼此唯一的

那么,我怎样才能比较两个物体呢

您的结构/类需要实现
equalable
协议,该协议允许您定义一个对象如何与同一类/结构的另一个对象相等

让我们从这个房屋结构开始:

struct House {
    var street: String
}

var houseA = House.init(street: "street A, n. 10")
var houseB = House.init(street: "street A, n. 10")

houseA == houseB // of course you can't
使用
equalable
协议,您可以实现
static func==
。在这里,您可以定义当您使用操作符
==
时,同一类的两个对象如何相等

在我的示例中,struct House的两个对象在具有相同街道时可以相等:

struct House: Equatable {
    var street: String

    static func == (lhs: House, rhs: House) -> Bool {
        return lhs.street == rhs.street
    }
}  

var houseA = House.init(street: "street A, n. 10")
var houseB = House.init(street: "street A, n. 10")

houseA == houseB // now print true

您的结构需要符合Equalable协议才能使用“==”进行比较“这不是我要寻找的答案”好吧,不管怎样,这就是答案……我完全明白这里要问的问题,并且希望做同样的事情:当一个结构有30个属性时,我想知道obj1的属性是否都等于obj2的相同属性,而不必编写(并维护!)一个30项长的比较,比如
obj1.abc==obj2.abc&&obj1.bcd==obj2.bcd&&…
。似乎应该有一个优雅的方式来做到这一点!如何调用此方法?是否需要比较结构的每个字段?我正在寻找另一种方法。如果您用这种方法定义
CustomerInfo
,只要在obj1==obj2时执行
。此比较将调用
static func==
并通过比较
billAddressCity
@Jan返回结果,然后您希望如何比较它们?给我们举个例子。不幸的是,这个问题已经解决了。但对于结构,另一个选项(在某些情况下可能很有用:)func arestractSequal(s1:T1,s2:T2)->Bool{var s1=s1 var s2=s2 let s1Data=Data(bytes:&s1,count:MemoryLayout.stride)let s2Data=Data(bytes:&s2,count:MemoryLayout.stride)返回s1Data==s2Data}基本上,这个想法是逐字节比较结构的原始数据。我用int测试了这一点,然后使用了几种不同类型的自定义结构。不幸的是,我不能在这里格式化代码xD