私は、スウィフト3プロジェクトでMIDI読み込みprocコールバックを設定しています。私はこの作業を行う目的だけでObjective Cに頼らなくても、プロジェクトをスウィフトにしておきたいと思っています。 Core MidiとSwiftには多くの記事がありますが、フレームワークが頻繁に変化しているため、これらの記事の構文はもう適用されません。コアミディスウィフト3でコールバックが許可されていません
//Midi Message Callback
func MIDIReadCallback (pktList :UnsafePointer<MIDIPacketList>, refCon :UnsafeMutableRawPointer?, srcConRef :UnsafeMutableRawPointer?) -> Void{
let packet = pktList.pointee.packet
for _ in 0..<Int(pktList.pointee.numPackets) {
let mirrorData = Mirror(reflecting: packet.data)
var counter: UInt16 = 0
for(_, value)in mirrorData.children{
let packetCount = packet.length
let n = value as! UInt8
let st = String(format: "%2X", n)
messageData.append(st)
counter += 1
if(value as! UInt8 == 247){
processMidiMessage()
break}
if(packetCount == counter){break}
}
}
}
私はこのような入力ポートを作成するときにこのコールバックを置く:
CheckError(error: MIDIInputPortCreate(client, "Input port" as CFString, MIDIReadCallback, &player, &inPort),
は、これは私に次の例外を与える:
AC関数ポインタにのみへの参照から形成することができます。 'func'またはリテラルクロージャ
この例外が何を意味するのかは私には不明です。関数のシグネチャは予想されるコールバックシグネチャと一致し、Swift関数のように見えます。
コンパイラがSwift関数を適切なCポインタコールバックとして受け入れるためには、何を変更する必要がありますか?
コールバックをインスタンスメソッドにすることはできません。類似の問題についてはhttp://stackoverflow.com/questions/33260808/how-to-use-instance-method-as-callback-for-function-which-takes-only-func-or-litを比較してください。 –