如何使结构符合协议“Equatable”?
我正在使用Xcode 7.3.1
struct MyStruct {
var id: Int
var value: String
init(id: Int, value: String) {
self.id = id
self.value = value
}
var description: String {
return "blablabla"
}
}
当我使用“MyStruct”时,Xcode显示错误:
MyStruct不符合协议“Equatable”
您是否有想法使MyStruct符合协议?
答案 0 :(得分:18)
从Swift 4.1开始,您所要做的就是遵守Equatable
协议,而无需实现==
方法。参见:SE-0185 - Synthesizing Equatable and Hashable conformance。
示例:
struct MyStruct: Equatable {
var id: Int
var value: String
}
let obj1 = MyStruct(id: 101, value: "object")
let obj2 = MyStruct(id: 101, value: "object")
obj1 == obj2 // true
请紧记:==
的默认行为是比较 all 类型属性(基于示例:lhs.id == rhs.id && lhs.value == rhs.value
)。如果您要实现自定义行为(例如,仅比较一个属性),则必须自己做:
struct MyStruct: Equatable {
var id: Int
var value: String
}
extension MyStruct {
static func ==(lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.id == rhs.id
}
}
let obj1 = MyStruct(id: 101, value: "obj1")
let obj2 = MyStruct(id: 101, value: "obj2")
obj1 == obj2 // true
这时,相等性将基于id
的值,而不管value
的值是什么。
答案 1 :(得分:17)
好的,经过大量的搜索,它正在运作......
struct MyStruct {
var id: Int
var value: String
init(id: Int, value: String) {
self.id = id
self.value = value
}
var description: String {
return "blablabla"
}
}
extension MyStruct: Equatable {}
func ==(lhs: MyStruct, rhs: MyStruct) -> Bool {
let areEqual = lhs.id == rhs.id &&
lhs.value == rhs.value
return areEqual
}
我的结构是在一个班级,所以它没有用。我把这个结构移出我的班级,现在它很好:)
答案 2 :(得分:8)
问题不在于结构是在一个类中。这当然是允许的,并且在许多情况下您可能想要这样做。问题在于Equatable协议的实现。你必须提供==(你已经完成)的全局实现,但是没有实体MyStruct ....它是ParentClass.MyStruct(如果结构是在父类中定义的)。在这种情况下,下面的示例本身可能不是一个很好的例子,但它确实显示了如果需要你可以如何做到这一点。
class ParentClass {
struct MyStruct {
var id: Int
var value: String
init(id: Int, value: String) {
self.id = id
self.value = value
}
var description: String {
return "blablabla"
}
}
}
extension ParentClass.MyStruct: Equatable {}
func ==(lhs: ParentClass.MyStruct, rhs: ParentClass.MyStruct) -> Bool {
let areEqual = lhs.id == rhs.id &&
lhs.value == rhs.value
return areEqual
}
let s1 = ParentClass.MyStruct(id: 1, value: "one")
let s2 = ParentClass.MyStruct(id: 2, value: "two")
let s3 = ParentClass.MyStruct(id: 1, value: "one")
s1.description //blablabla
s1 == s2 //false
s3 == s1 //true
注意:我喜欢实现Comparable而不仅仅是Equatable,这将允许您支持排序和其他功能。
答案 3 :(得分:-2)
类和结构是不同的。 Struct是值类型,但类是引用类型。
您无法在课程中定义结构。相反,您无法在struct中定义类。
Struct和class都可以符合任何协议,包括您的自定义协议。