2016-11-18 5 views
3

Я пытаюсь отправить следующую структуру от одного игрока к другому:Game Center - передача и прием данных с Swift

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, мне удалось конвертировать GamePacket в Data, используя что-то похожее на следующее:

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

Однако, я не могу понять, как преобразовать Data обратно в GamePacket на приемном конце, и я не уверен, что это правильный способ сделать это.

Любая помощь в значительной степени оценивается. Спасибо.

ответ

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 (String имеет метод data) или превратить GamePacket в совместимый класс NSCoding, что предлагает методы для преобразования себя в NSData.