Core MIDI - это API C, который предоставляет возможности, не найденные в других местах.«Downcasting» C Structs in Swift
Когда пользовательская настройка MIDI изменяется (например, вы подключили устройство), появляется уведомление.
Это тип вызываемой функции.
typealias MIDINotifyProc = CFunctionPointer<((UnsafePointer<MIDINotification>, UnsafeMutablePointer<Void>) -> Void)>
Первый параметр является MIDINotification структура, которая выглядит следующим образом:
struct MIDINotification {
var messageID: MIDINotificationMessageID
var messageSize: UInt32
}
Вы можете осуществить обратный вызов, как это:
func MyMIDINotifyProc (np:UnsafePointer<MIDINotification>, refCon:UnsafeMutablePointer<Void>) {
var notification = np.memory
switch (notification.messageID) {
case MIDINotificationMessageID(kMIDIMsgObjectAdded):
// In Objective-C you would just do a cast here
// This is the problem line
var m = np.memory as MIDIObjectAddRemoveNotification
Вы бы посмотреть на члена MESSAGEID, чтобы увидеть какое уведомление вы только что получили. Есть несколько (я показываю только один). Для каждого вида уведомления, вы получите другой-структуру передается в Это структура вы получаете, когда устройство было добавлено или удалено:.
struct MIDIObjectAddRemoveNotification {
var messageID: MIDINotificationMessageID
var messageSize: UInt32
var parent: MIDIObjectRef
var parentType: MIDIObjectType
var child: MIDIObjectRef
var childType: MIDIObjectType
}
Как вы видите, эта структура имеет дополнительную информацию. Например, «ребенок» может быть конечной точкой для устройства, поэтому вам нужны эти поля.
Проблема заключается в отказе от структуры MIDINotification (требуется сигнатурой обратного вызова) в MIDIObjectAddRemoveNotification. Строка, которую я показал с помощью «как», не работает.
Есть ли у вас какие-либо предложения по поводу такого «понижения»?
Обновление: Ну, это сработало некоторое время. Теперь он разбит на Swift 2.0 beta. –