Ich habe ein Midi Read Proc Callback Setup in einem Swift 3 Projekt. Ich möchte das Projekt in Swift ganz behalten, ohne auf Objective C zurückgreifen zu müssen, nur um das zu schaffen. Es gibt viele Artikel über Core Midi und Swift, aber da sich das Framework häufig ändert, gilt die Syntax in diesen Artikeln nicht mehr.Core Midi Read Callback nicht erlaubt in 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}
}
}
}
Ich habe diesen Rückruf in, wenn die Eingangs-Port wie folgt zu erstellen:
CheckError(error: MIDIInputPortCreate(client, "Input port" as CFString, MIDIReadCallback, &player, &inPort),
Das gibt mir die folgende Ausnahme:
AC Funktionszeiger kann nur von einem Verweis auf eine gebildet werden 'func' oder eine wörtliche Schließung
Es ist mir unklar, was diese Ausnahme bedeutet. Die Signatur der Funktion entspricht der erwarteten Callback-Signatur und sieht nur wie eine Swift-Funktion aus.
Was muss ich ändern, damit der Compiler meine Swift-Funktion als richtigen c-Pointer-Callback annimmt?
Der Rückruf darf keine Instanzmethode sein. Vergleichen Sie http://stackoverflow.com/questions/33260808/how-to-use-instance-method-as-callback-for-function-which-takes-only-func--lit für ein ähnliches Problem. –