2016-05-31 72 views
6

我有一点问题..Swift,Struct不符合协议Equatable?

如何使一个结构符合协议“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”,我有一个错误:MYSTRUCT不符合协议 “Equatable”

你有没有想让MyStruct符合协议? :/

感谢您的帮助:)

回答

14

OK,很多搜索后,它的工作...

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 
} 

我的结构是一类,所以它没有工作..我把这个Struct移出我的班,现在它很好:)

+0

请参阅DJohnson的答案:在课堂上不是问题 – akroy

-1

类和结构是不同的。结构是值类型,但类是引用类型。

您不能在类中定义结构。相反,你不能在struct中定义类。

结构和类都可以符合任何协议,包括您的自定义协议。

6

问题不在于该结构在类中。这当然是可以允许的,并且有许多情况下你可能想要这样做。问题在于执行可衡量的议定书。您必须提供==的全局实现(您已完成),但是没有实体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,它将允许您支持排序和其他功能。