gpt4 book ai didi

swift - 实现可散列和重载运算符的协议(protocol)

转载 作者:可可西里 更新时间:2023-11-01 01:38:57 24 4
gpt4 key购买 nike

我有以下结构:

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
}

导致错误“使用未声明的类型‘Self’”和

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

导致错误'Protocol 'MidiPlayable' can only be used as a generic constraint because it has Self or associated type requirements'

我该如何解决这个问题?

最佳答案

我想你需要这样的东西:

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
}

关于swift - 实现可散列和重载运算符的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32748297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com