2015-09-06 52 views
3

我正在學習Objective-c here中編寫的教程,我已將大部分內容轉換爲swift,但有些代碼行不起作用。將ObjC轉換爲Swift - UnsafePointer <Void>不可轉換爲結構類型

例如,我已經轉換以下結構:

typedef struct { 
    MessageType messageType; 
} Message; 
typedef struct { 
    Message message; 
} MessageMove; 

這樣:

struct Message { 
    var messageType:MessageType 
} 
struct MessageMove { 
    var message:Message 
} 

而在另一個線路中,教程執行以下操作:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data 
    fromPlayer:(NSString *)playerID { 
    Message *message = (Message*)[data bytes]; 
    if (message->messageType == kMessageTypeMove) { 
     MessageMove *messageMove = (MessageMove*) [data bytes]; 
    } 
} 

我試着將它改爲:

func matchDidReceiveDataFromPlayer(match: GKMatch, data: NSData, player: GKPlayer) { 
    //1 
    var message = data.bytes as Message //DOESNT WORK 
    if (message.messageType == MessageType.kMessageTypeGameBegin) 
     //2 
     var messageMove = data.bytes as MessageMove //WORKS 
    } 

但劇組中第(// 1)不工作,它說以下內容:

UnsafePointer<Void> not convertible to Message

但是第二投(// 2)的作品。是因爲我正在檢查if語句中的消息類型嗎?

有關如何解決此問題的任何想法?

回答

2

是因爲我正在檢查if語句中的消息類型嗎?

號這是因爲,由於在//1的第一個錯誤,編譯器永遠不會到達第二線//2可言。如果編譯器達到它,你會得到同樣的錯誤。

現在讓我們來談談語法。如果你真的相信data.bytes是相同的消息實例,你會說:

let message = UnsafePointer<Message>(data.bytes).memory 

不過,我個人寧可傾向於懷疑,你從Objective-C中得到的數據將構成斯威夫特結構!畢竟,在Objective-C的末端,推測是一個不同的動物,其結果是C struct

+0

感謝您的解釋。但是你的意思是「在目標-c結束時進行了什麼」?即使我的'sendData()'方法發送一個Swift結構?或者你是否在說'在處理'NSData'時調用objective-c api? –

+0

我從未使用過遊戲工具包。我不知道如何調用這個方法,或者字節如何進入NSData。我根據你所說的回答。 – matt

相關問題