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
}