簡體   English   中英

如何從Swift中的void UnsafePointer中提取數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM