2016-05-31 6 views
6

У меня есть небольшая проблема ..Swift, Struct не соответствует протоколу Equable?

Как сделать структуру соответствующей протоколу «Равносимвольный»? Я использую 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 - тип значения, но класс - ссылочный тип.

Вы не можете определить struct в классе. Напротив, вы не можете определить класс в struct.

Структура и класс могут соответствовать любому протоколу, включая ваш собственный протокол.

6

Проблема заключается не в том, что структура находится внутри класса. Это, безусловно, допустимо, и есть много случаев, когда вы можете это сделать. Проблема заключается в реализации 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 

Примечание: Я хотел бы реализовать Сопоставимые, а не только Equatable, что позволит вам поддерживать сортировку и другие функции.