【问题标题】:converting ObjC to Swift - UnsafePointer<Void> not convertible to struct type将 ObjC 转换为 Swift - UnsafePointer<Void> 不能转换为结构类型
【发布时间】:2015-09-06 11:21:16
【问题描述】:

我正在学习用 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&lt;Void&gt; not convertible to Message

但是第二个演员 (//2) 有效。是不是因为我在检查 if 语句中的消息类型?

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

【问题讨论】:

    标签: ios objective-c xcode swift


    【解决方案1】:

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

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

    现在让我们谈谈语法。如果你真的相信 data.bytes 和 Message 实例一样,你会说:

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

    但是,我个人更倾向于怀疑从 Objective-C 获得的数据是否会构成 Swift 结构!毕竟,Objective-C 端的内容大概是一个 C 结构,它是另一种动物。

    【讨论】:

    • 感谢您的解释。但是what went in at the objective-c end 是什么意思?即使我的 sendData() 方法发送一个 Swift 结构?或者您是说在处理NSData 时调用了objective-c api?
    • 我从未使用过 Game Kit。我不知道如何调用此方法或字节将如何进入该 NSData。我是根据你说的来回答的。
    猜你喜欢
    • 2015-06-15
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多