2016-05-31 27 views
6

Ho un piccolo problema ..Swift, Struct non è conforme al protocollo Equitable?

Come rendere una struttura conforme al protocollo "Equitable"? Io uso Xcode 7.3.1

Il mio codice:

struct MyStruct { 
    var id: Int 
    var value: String 

    init(id: Int, value: String) { 
     self.id = id 
     self.value = value 
    } 

    var description: String { 
     return "blablabla" 
    } 

} 

E dopo, nel mio codice, quando uso "MyStruct", ho un errore: MyStruct non è conforme al protocollo "equatable"

Hai un'idea per rendere MyStruct conforme al protocollo? :/

Grazie per il vostro aiuto :)

risposta

14

OK, dopo un sacco di ricerche, sta funzionando ...

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 
} 

mio Struct era in una classe, in modo che non ha funzionato .. Ho spostato questo Struct fuori dalla mia classe e ora è buono :)

+0

Vedere la risposta di DJohnson: stare in una classe non era il problema – akroy

-1

Classe e struttura sono differenti. Struct è un tipo di valore, ma la classe è un tipo di riferimento.

Non è possibile definire la struttura in classe. Al contrario, non è possibile definire la classe in struct.

Struct e class entrambi possono essere conformi a qualsiasi protocollo incluso il protocollo personalizzato.

6

Il problema non è che la struttura sia all'interno di una classe. Questo è certamente ammissibile, e ci sono molti casi in cui potresti voler farlo. Il problema è nell'implementazione del protocollo Equatable. Devi dare un'implementazione globale di == (che hai fatto), ma non esiste un'entità MyStruct .... è ParentClass.MyStruct (se la struct è definita all'interno di una classe genitore). L'esempio di seguito in sé non è probabilmente un buon esempio in questo caso, ma mostra come è possibile farlo se necessario.

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 

Nota: mi piace implementare Comparable anziché solo Equitable, che consentirà di supportare l'ordinamento e altre funzionalità.