2015-02-23 138 views
10

在Objective-C我用下面的代码来如何在Swift中将Int转换为NSData?

  1. 转换一个Int可变进NSData,字节的分组。

    int myScore = 0; 
    NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)]; 
    
  2. 使用转换NSData可变成的方法。

    [match sendDataToAllPlayers: 
    packet withDataMode: GKMatchSendDataUnreliable 
    error: &error]; 
    

我试图Objective-C的码转换为夫特:

var myScore : Int = 0 

func sendDataToAllPlayers(packet: Int!, 
      withDataMode mode: GKMatchSendDataMode, 
      error: NSErrorPointer) -> Bool { 

      return true 
} 

然而,我无法一个Int变量转换成NSData和使用它的方法。我怎样才能做到这一点?

+1

http://stackoverflow.com/a/28662828/2303865 – 2015-02-23 19:02:34

回答

20

要转换IntNSData

var score: Int = 1000 
let data = NSData(bytes: &score, length: sizeof(Int)) 

var error: NSError? 
if !match.sendDataToAllPlayers(data, withDataMode: .Unreliable, error: &error) { 
    println("error sending data: \(error)") 
} 

将其转换回:

func match(match: GKMatch!, didReceiveData data: NSData!, fromPlayer playerID: String!) { 
    var score: Int = 0 
    data.getBytes(&score, length: sizeof(Int)) 
} 
+0

在不同的字节顺序的设备之间,IMO这样的'data'将不可移植(不应该在没有附加元数据的情况下传输)(请参阅[这里](http://stackoverflow.com/questions/28662770/how-doi-i-发送 - 数据 - 从-A-gkplayer到另一个功能于一个匹配/ 28727335#28727335))。 – Drux 2015-02-25 20:55:06

+0

我真的同意。我在[向其他玩家发送数据]之后模拟了我的回答(https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/Matchmaking/Matchmaking.html#//apple_ref/doc/uid/TP40008304-CH9-SW27)在_游戏中心编程指南中进行了讨论_,但使用归档或plist或其他更强大的格式似乎更为谨慎。 – Rob 2015-02-25 21:39:36

+0

您可以使用'score.bigEndian'或'score.littleEndian'来强制字节顺序具有特定的字节顺序。这些数据将在可以写入一个并在另一个上读取的体系结构之间兼容。 – Benjohn 2017-04-05 08:32:17

3

您可以用这种方式转换:

var myScore: NSInteger = 0 
let data = NSData(bytes: &myScore, length: sizeof(NSInteger)) 
+0

非常感谢!可否请你告诉我如何在我的方法中包含'data'?当我用这种方式编码时,我得到'data不是一个类型':'func sendDataToAllPlayers(data,' – Cesare 2015-02-23 18:44:22

+0

不客气:)对不起,我不明白你的问题,你需要做什么? – 2015-02-23 18:51:02

+0

如果你看看我的问题的第二个重点,有一个函数的代码'sendDataToAllPlayers'现在,我已经翻译了这个函数,但是我想在你的回答中声明的常量'data'包含到我的Swift方法中。很抱歉对于这个误会! – Cesare 2015-02-23 18:54:28

17

与SWIFT 3.x和4.0 :

var myInt = 77 
var myIntData = Data(bytes: &myInt, 
        count: MemoryLayout.size(ofValue: myInt))