2014-09-24 3 views
3

У меня есть следующий код в Objective-C (который использует рамки Audio Toolbox), что я пытаюсь преобразовать Swift:Как извлечь данные из void UnsafePointer в Swift?

MusicTimeStamp timeStamp; 
MusicEventType eventType; 
const void *eventData; 
UInt32 eventDataSize; 

//MusicEventIteratorGetEventInfo is declared in Audio Toolbox framework as this: 
//OSStatus MusicEventIteratorGetEventInfo (MusicEventIterator inIterator, MusicTimeStamp *outTimeStamp, MusicEventType *outEventType, const void **outEventData, UInt32 *outEventDataSize); 

MusicEventIteratorGetEventInfo(anIterator, &timeStamp, &eventType, &eventData, &eventDataSize); 

switch (eventType){ 
    case kMusicEventType_MIDINoteMessage: 
     //extract info from eventData assuming it's a MIDINoteMessage. 
     UInt8 channel = ((MIDINoteMessage *) eventData)->channel 
     UInt8 note = ((MIDINoteMessage *) eventData)->note 
     UInt8 velocity = ((MIDINoteMessage *) eventData)->velocity 
     Float32 duration = ((MIDINoteMessage *) eventData)->duration 

    case kMusicEventType_MIDIChannelMessage: 
     //extract info from eventData assuming it's a MIDIChannelMessage. 

    //case ..., etc. 
} 

Когда переписывание его в Swift, я не могу понять как получить данные из части «const void * eventData», несмотря на чтение документации Apple по небезопасным указателям (ни один из их примеров, похоже, не связан с извлечением данных из небезопасного указателя таким образом). Это то, что я до сих пор, но я потерял в плане того, что должно быть заявление переключатель:

var timeStamp: MusicTimeStamp = 0 
var eventType: MusicEventType = 0 
var eventData: UnsafeMutablePointer<UnsafePointer<Void>> = nil 
var eventDataSize: UInt32 = 0 

MusicEventIteratorGetEventInfo(iterator, &timeStamp, &eventType, eventData, &eventDataSize) 

//what would simplest equivalent switch statement be? 

Любая помощь будет оценена - спасибо.

+1

это сообщение сделок с небезопасными указателями http://stackoverflow.com/questions/24838106/using-audiobufferlist-with-swift?rq=1 – chris

+0

для что-то настолько фундаментальное для основных библиотек Apple, действительно ли нет более простого способа? Честно говоря, я даже не уверен, что могу понять, как применить это сообщение к моему примеру, хотя я уверен, что это полезно для большинства ... –

+0

Я бы использовал Objective-C для этого и позвонил объекты/методы высокого уровня из Swift. Это не должно быть так сложно. –

ответ

4

Пока вы знаете, какие данные вы получили в этом небезопасном указателе, вы всегда можете использовать различные конструкторы каждого варианта для перевода между указателями. Ваш пример тривиален, чтобы перевести, если иметь это в виду:

import AudioToolbox 

var timeStamp : MusicTimeStamp = 0 
var eventType : MusicEventType = 0 
var eventData : UnsafePointer<Void> = nil 
var eventDataSize : UInt32 = 0; 

MusicEventIteratorGetEventInfo(anIterator, &timeStamp, &eventType, &eventData, &eventDataSize); 

switch (eventType){ 
    case kMusicEventType_MIDINoteMessage: 
     let data = UnsafePointer<MIDINoteMessage>(eventData) 
     let channel = data.memory.channel 
     let note = data.memory.note 
     let velocity = data.memory.velocity 
     let duration = data.memory.duration 

    case kMusicEventType_MIDIChannelMessage: 
     //extract info from eventData assuming it's a MIDIChannelMessage. 

     //case ..., etc. 
} 
+0

Есть несколько обновлений для Swift 3, но как только вы 1> var eventData: UnsafeRawPointer? = nil и2> let data = UnsafePointer (eventData? .assumingMemoryBound (to: MIDINoteMessage.self)) остальное должно быть очевидным – narco

Смежные вопросы