2016-11-18 7 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") 
     } 
    } 
} 

そしてを受信するためのコード:ObjectiveCで書かれたいくつかのサンプルから

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

、私が管理ここ

は、私がこれまでパケットを送信するためにしているコードです次のようなものを使用してGamePacketDataに変換してください。

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

しかし、私は、受信側でGamePacketDataバックを変換する方法を見つけ出すことはできません、また私は確かに、これはそれを行うための正しい方法であると思います。

どのようなヘルプも非常に評価されています。ありがとうございました。

答えて

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 
} 

私はまだSWIFTの下で直接アドレスを持つ自分自身を混乱していないので、私はこれが最善のアプローチであるかどうか全くわかりません。オプションの戻り値型を使用していることに注意してください。これはコード内で異なる方法で設計できます(いくつかのチェックを追加したり、変数をアンラップして返したり、チェックが失敗したときに例外をスローすることができます)。

また、あなたは順番に(文字列dataメソッドを持っている)NSDataに変換することができた、(例えば、読みやすくするために)StringにあなたのGamePacketを書き込み方法を設計できます。また、NSCoding準拠したクラスにGamePacketを回すことNSDataにも変換する方法を提供しています。

関連する問題