Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 实现哈希和重载运算符的协议_Swift_Cocoa_Swift Protocols - Fatal编程技术网

Swift 实现哈希和重载运算符的协议

Swift 实现哈希和重载运算符的协议,swift,cocoa,swift-protocols,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 octa

我的结构如下:

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
}
我想把这些类型传递给我的播放设备,因为我只需要知道原始值。另外,它们将被放置在集合中,因此哈希是必要的,而且我想比较它们,因此我希望重载运算符==!=<和>

我尝试了两种方法(都是自由函数)

导致错误“使用未声明的类型“Self” 及

导致错误“协议”MidiPlayable“只能用作一般约束,因为它具有自身或关联的类型要求”


如何解决这个问题?

我想您需要这样的解决方案:

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
}
协议MIDI可播放:可散列{
值:UInt8{get}
}
扩展MIDI可播放{
var hashValue:Int{
返回midiValue.hashValue
}
}
func==(左:A,右:A)->Bool{
返回lhs.midiValue==rhs.midiValue
}
结构打击声:MIDI可播放{
让midiValue:UInt8
let name:String
let类型:打击式
}
结构注释:可散列,可播放{
让midiValue:UInt8
让我们来投球
let倍频程:UInt8
}

很抱歉,我现在已经修复了。在这种情况下,回答您自己的问题并将其标记为正确。不,我的意思是我已经修复了问题,我仍然有这个错误是的,解决了编译错误,但产生了另一个错误,现在,如果我忽略MidiPlayable类型的属性,它会抱怨说,协议MidiPlayable只能用作泛型约束,因为它具有自类型或关联类型requirements@LukeDeFeo如果你想在你的类型中有任何自我关系,这是意料之中的,也是不可避免的。那么我可以做些什么来声明属性这些类型
func ==(lhs: MidiPlayable, rhs: MidiPlayable) -> Bool {
    return lhs.midiValue == rhs.midiValue
}
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
}