2015-09-23 2 views
2

I имеет следующую структуру:протокола, который реализует hashable и перегружать операторы

protocol MidiPlayable : Hashable { 
    var midiValue: UInt8 { get } 
} 

struct PercussionSound : MidiPlayable { 
    let name: String 
    let type: PercussionType  
} 

struct Note : Hashable, MidiPlayable { 

    let pitch: Pitch 
    let octave: UInt8 
    let midiValue: UInt8 
} 

Я хочу пройти вокруг этих типов на устройство воспроизведения, как Midiplayable, как я только нужно знать о необработанном значении. Additionaly они будут размещены в наборе так Hashable необходимо, а также я хочу, чтобы сравнить их, так что я хочу, чтобы перегрузить оператор ==! = < и>

Я попробовал два подхода (как в виде свободных функций)

func ==(lhs: Self, rhs: Self) -> Bool { 
    return lhs.midiValue == rhs.midiValue 
} 

приводит к ошибке «Использование необъявленного типа„Я“» и

func ==(lhs: MidiPlayable, rhs: MidiPlayable) -> Bool { 
    return lhs.midiValue == rhs.midiValue 
} 

приводит к ошибке «Протокол„MidiPlayable“может быть использовано только в качестве общего ограничения, поскольку он имеет Самость или связанные с ними требования типа»

Как я могу решить эту проблему?

+0

К сожалению я исправил сейчас –

+0

В этом случае ответа на свой собственный вопрос и пометить его как правильный. – Qbyte

+0

Нет, я имею в виду, что у меня есть вопрос, который у меня все еще есть. –

ответ

2

Я думаю, что нужно что-то вроде этого:

protocol MidiPlayable : Hashable { 
    var midiValue: UInt8 { get } 
} 

extension MidiPlayable { 
    var hashValue : Int { 
     return midiValue.hashValue 
    } 
} 

func ==<A: MidiPlayable>(lhs: A, rhs: A) -> Bool { 
    return lhs.midiValue == rhs.midiValue 
} 

struct PercussionSound : MidiPlayable { 
    let midiValue: UInt8 
    let name: String 
    let type: PercussionType 
} 

struct Note : Hashable, MidiPlayable { 
    let midiValue: UInt8 
    let pitch: Pitch 
    let octave: UInt8 
} 
+0

Да, что решить эту ошибку компиляции, но создала еще одну, теперь, если я рассмотрю простейший тип MidiPlayable, он жалуется и говорит, что протокол MidiPlayable может использоваться только как общее ограничение потому что у него есть требования к себе или связанному типу –

+0

@LukeDeFeo Это ожидаемо и неизбежно, если вы хотите иметь какие-либо собственные отношения в своем типе – Kametrixom

+0

Хорошо, что бы я делал, чтобы объявлять свойства в терминах этих типов –