将ObjC转换为Swift - UnsafePointer <void>不可转换为struct类型

时间:2015-09-06 00:50:50

标签: ios objective-c xcode swift

我按照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语句中的消息类型吗?

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:2)

  

是因为我正在检查if语句中的消息类型吗?

没有。这是因为,由于//1上的第一个错误,编译器根本不会到达第二行//2。如果编译器到达它,你会得到同样的错误。

现在让我们来谈谈语法。如果您确实认为data.bytes与Message实例相同,那么您会说:

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

但是,我个人更倾向于怀疑从Objective-C获得的数据是否构成Swift结构!毕竟,Objective-C端的内容可能是 C struct ,这是一种不同的动物。