2016-11-18 68 views
3

我试图从一个玩家发送以下结构到另一个发送和接收数据:游戏中心 - 斯威夫特与

struct GamePacket { 
    var action: String 
    var pointArray: [CGPoint] 
} 

我有一个很难搞清楚的GamePacket转换为正确的方式Data,然后再回来。

下面是代码我迄今发送包:

func send(packet: GamePacket) { 
    //convert GamePacket to Data here 
    let data = Data.init() 

    var remotePlayerArray = [GKPlayer]() 

    if let currentPlayer = self.currentPlayer, let match = self.match, let playerArray = self.match?.players { 
     for player in playerArray { 
      if player != currentPlayer { 
       remotePlayerArray.append(player) 
      } 
     } 

     do { 
      try match.send(data, to: remotePlayerArray, dataMode: GKMatchSendDataMode.reliable) 
     } 
     catch { 
      print("connectionError") 
     } 
    } 
} 

和接收为代码:

func match(_ match: GKMatch, didReceive data: Data, fromRemotePlayer player: GKPlayer) { 
    //convert Data to GamePacket here 
} 

从写在ObjectiveC一些样品,我设法转换GamePacketData使用的东西simmilar以下几点:

let data = NSData(bytes: &packet, length: MemoryLayout<GamePacket>.size) as Data 

但是,我想不出如何将Data转换回GamePacket在接收端,我也没有肯定这是做了正确的道路。

任何帮助是极大apreciated。谢谢。

回答

2

一个快速和肮脏的解决办法是这样的:

func encodeGamePacket(packet: GamePacket) -> NSData { 
    return NSData(bytes: &gamePacket, length: MemoryLayout<GamePacket>.size) 
} 

func decodeGamePacket(data: NSData) -> GamePacket? { 
    var tempBuffer:GamePacket? = nil 
    data.getBytes(&tempBuffer, length: MemoryLayout<GamePacket>.size) 
    return tempBuffer 
} 

我还没有直接的地址迅速下搞砸自己呢,所以我不能完全肯定这是否是最好的办法。请注意,我使用了可选的返回类型,您可以在代码中以不同的方式进行设计(可能会添加一些检查,打开变量并返回它或在检查失败时抛出异常)。

或者你可以设计你的GamePacket写进String的方法(为便于阅读,例如),您可以依次转换成NSData(串有data法),或者你把GamePacketNSCoding兼容类还提供了将自身转换为NSData的方法。