我正在尝试将以下结构从一个玩家发送到另一个玩家:
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
但是,我无法弄清楚如何将this
转换回接收端的var select = $("#selectElement");
select.val(select.children(":first").val());
,我也不确定这是否是正确的方法。
任何帮助都非常有用。谢谢。
答案 0 :(得分:3)
Codable
struct GamePacket: Codable {
var action: String
var pointArray: [CGPoint]
}
然后,您可以轻松转换为Data
:
func save<T: Encodable>(_ item: T, to url: URL) throws -> Data {
let encoder = JSONEncoder()
return try encoder.encode(item)
}
func load<T: Decodable>(from data:Data) throws -> T {
let decoder = JSONDecoder()
let item = try decoder.decode(T.self, from: data)
return item
}
答案 1 :(得分: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
(字符串有{{} 1}}方法)或者您将data
转换为GamePacket
兼容类,该类提供将自身转换为NSCoding
的方法。