2016-11-18 69 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的方法。