Objective c 如何从Swift中的void UnsafePointer中提取数据?
我在Objective-C(使用音频工具箱框架)中有以下代码,我正试图将其转换为Swift: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
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))其余的应该是显而易见的