2015-02-23 15 views
10

In Objective-C verwende ich den folgenden CodeWie konvertiert man einen Int in NSData in Swift?

  1. Konvertieren ein Int Variable in NSData, ein Paket von Bytes.

    int myScore = 0; 
    NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)]; 
    
  2. die konvertierte NSData Variable in einer Methode verwenden.

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

Ich versuchte, den Objective-C-Code in Swift Umwandlung:

var myScore : Int = 0 

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

      return true 
} 

Aber ich bin nicht in der Lage eine Int Variable in ein NSData und es zu verwenden, ein Verfahren zu konvertieren. Wie kann ich das machen?

+1

http://Stackoverflow.com/a/28662828/2303865 –

Antwort

20

zu konvertieren Int-NSData:

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)") 
} 

es zu konvertieren zurück:

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

IMO solche 'Daten' sind nicht portabel (sollten nicht ohne zusätzliche Metadaten übertragen werden) zwischen Geräten mit unterschiedlichen Byte-Ordnungen (siehe [hier] (http://stackoverflow.com/questions/28662770/how-do-i- send-data-from-a-gplayer-zu-einem-in-einem-Spiel/28727335 # 28727335)). – Drux

+0

stimme ich tatsächlich zu. Ich habe meine Antwort nach dem [Senden von Daten an andere Spieler] modelliert (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/Matchmaking/Matchmaking.html#//apple_ref/doc/uid)/TP40008304-CH9-SW27) Diskussion im _Game Center Programming Guide, _ aber es scheint schlauer, Archiv oder Plist oder ein anderes robusteres Format zu verwenden. – Rob

+0

Sie können 'score.bigEndian' oder' score.littleEndian' verwenden, um zu erzwingen, dass die Byte-Reihenfolge eine bestimmte Endianität aufweist. Die Daten sind dann kompatibel zwischen Architekturen, die auf einer geschrieben und auf einer anderen gelesen werden können. – Benjohn

3

Sie können auf diese Weise konvertieren:

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

Vielen Dank! Können Sie mir bitte sagen, wie man "Daten" in meine Methode einbezieht? Ich bekomme 'Daten ist kein Typ', wenn ich es so codiere:' func sendDataToAllPlayers (Daten, ' – Cesare

+0

Gern geschehen :) Entschuldigung, ich verstehe Ihre Frage nicht, was Sie tun müssen? –

+0

Wenn Sie sich den zweiten Aufzählungspunkt meiner Frage ansehen, gibt es einen Code einer Funktion 'sendDataToAllPlayers'. Jetzt habe ich diese Funktion bereits übersetzt, aber ich möchte die Konstante' Daten', die Sie in Ihrer Antwort deklariert haben, in meine Swift-Methode aufnehmen . Entschuldigen Sie das Missverständnis! – Cesare

17

Mit Swift 3.x und 4.0 :

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