我按照Objective-c here编写的教程,并且我已经将大部分内容转换为swift,但有些行只是没有成功。
例如,我已经转换了以下结构:
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语句中的消息类型吗?
关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
是因为我正在检查if语句中的消息类型吗?
没有。这是因为,由于//1
上的第一个错误,编译器根本不会到达第二行//2
。如果编译器到达它,你会得到同样的错误。
现在让我们来谈谈语法。如果您确实认为data.bytes
与Message实例相同,那么您会说:
let message = UnsafePointer<Message>(data.bytes).memory
但是,我个人更倾向于怀疑从Objective-C获得的数据是否构成Swift结构!毕竟,Objective-C端的内容可能是 C struct ,这是一种不同的动物。