如何比较两个Struct对象?

Jan*_*Jan 4 ios swift

对于具有不同值的同一结构类,我有两个对象.我需要比较这两个对象是否相等.请引导我通过适当的解决方案.

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)
  }
Run Code Online (Sandbox Code Playgroud)

这不是我寻找的答案,因为它说我需要手动比较字段的每个值, 比较Swift中对象的两个实例

Giu*_*nza 19

在面向对象的世界中,通常,所有对象彼此都是唯一的.

那么,我如何比较两个对象?

您的struct/class需要实现EquatableProtocol,它允许您定义一个对象如何等于同一个类/ struct的另一个对象

让我们从这个House结构开始:

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
Run Code Online (Sandbox Code Playgroud)

使用该Equatable协议,您可以实现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
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是这个问题已经结束了。但对于结构体,另一个选项(在某些情况下可能有用:) func areStructsEqual<T1,T2>(s1: T1, s2: T2) -> Bool { var s1 = s1 var s2 = s2 let s1Data = Data( bytes: &s1, count: MemoryLayout<T1>.stride) let s2Data = Data(bytes: &s2, count: MemoryLayout<T2>.stride) return s1Data == s2Data } 基本上,这个想法是将结构体的原始数据逐字节进行比较字节。我使用整数进行了测试,然后使用了几种不同类型的自定义结构。不幸的是我无法在这里格式化代码 xD (3认同)

sCh*_*Cha 6

通过遵守Equatable

struct CustomerInfo: Equatable {
    var billAddressCity: String?

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

    static func ==(lhs: CustomerInfo, rhs: CustomerInfo) -> Bool {
        return (lhs.billAddressCity == rhs.billAddressCity)
    }
}
Run Code Online (Sandbox Code Playgroud)