2016-05-31 71 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,它將允許您支持排序和其他功能。