Objective c 如何从Swift中的void UnsafePointer中提取数据?

Objective c 如何从Swift中的void UnsafePointer中提取数据?,objective-c,pointers,swift,audiotoolbox,Objective C,Pointers,Swift,Audiotoolbox,我在Objective-C(使用音频工具箱框架)中有以下代码,我正试图将其转换为Swift: MusicTimeStamp timeStamp; MusicEventType eventType; const void *eventData; UInt32 eventDataSize; //MusicEventIteratorGetEventInfo is declared in Audio Toolbox framework as this: //OSStatus MusicEventIte

我在Objective-C(使用音频工具箱框架)中有以下代码,我正试图将其转换为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”部分获取数据,尽管我阅读了苹果关于不安全指针的文档(他们的示例似乎都与以这种方式从不安全指针提取数据无关)。这是我到目前为止所知道的,但我不知道switch语句应该是什么:

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?
var时间戳:MusicTimeStamp=0
var eventType:MusicEventType=0
var eventData:UnsafeMutablePointer=nil
var eventDataSize:UInt32=0
MusiceVenteratorGetEventInfo(迭代器、时间戳、事件类型、事件数据和事件数据大小)
//最简单的等价switch语句是什么?

任何帮助都将不胜感激-谢谢。

只要您知道该不安全指针中隐藏了什么样的数据,就可以始终使用每个变量的各种构造函数在指针之间进行强制转换。如果您牢记以下几点,那么您的示例很难翻译:

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.
}
导入音频工具箱 var时间戳:MusicTimeStamp=0 var eventType:MusicEventType=0 var eventData:UnsafePointer=nil var eventDataSize:UInt32=0; musiceventeratorgeteventinfo(一个迭代器、&timeStamp、&eventType、&eventData、&eventDataSize); 开关(事件类型){ 案例kMusicEventType_MidNoteMessage: let data=UnsafePointer(eventData) 让通道=data.memory.channel let note=data.memory.note 让速度=data.memory.velocity 让持续时间=data.memory.duration 案例kMusicEventType_midChannelMessage: //假设事件数据是一条消息,则从中提取信息。 //案例…,等等。 }
这篇文章讨论的是苹果核心库中的不安全指针,真的没有更简单的方法吗?老实说,我甚至不知道如何将这篇文章应用到我的示例中,尽管我确信它对大多数人都有用……我会使用Objective-C来实现这一点,并从Swift调用高级对象/方法。不需要这么复杂。Swift 3有一些更新,但一旦1>var eventData:UnsafeRawPointer?=nil和2>let data=UnsafePointer(eventData?.assumingmemorybind(to:MIDINoteMessage.self))其余的应该是显而易见的