2015-09-06 72 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