![](/img/trans.png)
[英]How Does Parameter Type (void *) In Objective-C Translate To UnsafePointer<()> In Swift?
[英]how do I extract data from void UnsafePointer in Swift?
我在Objective-C(使用Audio Toolbox框架)中有以下代碼,我正在嘗試將其轉換為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文檔(他們的例子似乎都與提取數據無關)以這種方式的不安全指針)。 這是我到目前為止所擁有的,但我在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?
任何幫助將不勝感激 - 謝謝。
只要你知道你在那個不安全的指針中找到了什么樣的數據,你總是可以使用每個變量的各種構造函數來在指針之間進行轉換。 如果你牢記這一點,你的例子是微不足道的翻譯:
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.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.