将ObjC转换为Swift - UnsafePointer 不可转换为结构类型
问题描述:
我正在学习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语句中的消息类型吗?
有关如何解决此问题的任何想法?
答
是因为我正在检查if语句中的消息类型吗?
号这是因为,由于在//1
的第一个错误,编译器永远不会到达第二线//2
可言。如果编译器达到它,你会得到同样的错误。
现在让我们来谈谈语法。如果你真的相信data.bytes
是相同的消息实例,你会说:
let message = UnsafePointer<Message>(data.bytes).memory
不过,我个人宁可倾向于怀疑,你从Objective-C中得到的数据将构成斯威夫特结构!毕竟,在Objective-C的末端,推测是一个不同的动物,其结果是C struct。
感谢您的解释。但是你的意思是“在目标-c结束时进行了什么”?即使我的'sendData()'方法发送一个Swift结构?或者你是否在说'在处理'NSData'时调用objective-c api? –
我从未使用过游戏工具包。我不知道如何调用这个方法,或者字节如何进入NSData。我根据你所说的回答。 – matt