Ios 如何比较两个Struct对象?
对于同一个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 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