实现hashable和重载运算符的协议

时间:2015-09-23 19:49:20

标签: swift cocoa swift-protocols

我有以下结构:

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,因为我只需要知道原始值。另外它们将被置于集合中,因此Hashable是必要的,我也想比较它们,所以我希望重载运算符==!=<和>

我尝试了两种方法(都是免费功能)

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

导致错误'使用未声明的类型'自我'' 和

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

导致错误'协议'MidiPlayable'只能用作通用约束,因为它具有Self或相关类型要求'

我该如何解决这个问题?

1 个答案:

答案 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
}