2015-02-23 10 views
10

W celu C użyć następującego koduJak przekonwertować Int na NSData w Swift?

  1. Konwersja zmiennej Int do NSData, pakiet bajtów.

    int myScore = 0; 
    NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)]; 
    
  2. pomocą przekształca NSData zmiennej w tym sposobie.

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

Próbowałem konwersji kod Objective-C w Swift:

var myScore : Int = 0 

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

      return true 
} 

Jednak nie jestem w stanie przerobić zmienną Int się z NSData i używać go takie metody. Jak mogę to zrobić?

+1

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

Odpowiedz

20

do konwersji Int do 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)") 
} 

Aby przekształcić go z powrotem:

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

IMO takie "dane" nie będą przenośne (nie powinny być przesyłane bez dodatkowych metadanych) między urządzeniami z różnymi zamówieniami bajtów (patrz [tutaj] (http://stackoverflow.com/questions/28662770/how-do-i- send-data-from-a-gkplayer-to-another-in-a-match/28727335 # 28727335)). – Drux

+0

Zgadzam się. Po prostu modelowałem swoją odpowiedź po wysłaniu danych do innych graczy (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/Matchmaking/Matchmaking.html#//apple_ref/doc/uid/TP40008304-CH9-SW27) dyskusja w Przewodniku po programowaniu _Game Center, _ ale korzystanie z archiwum, plistu lub innego bardziej odpornego formatu wydaje się bardziej rozsądne. – Rob

+0

Możesz użyć 'score.bigEndian' lub' score.littleEndian', aby wymusić kolejność bajtów o określonej endianness. Dane będą wówczas zgodne między architekturami, które można zapisać na jednym i czytać na innym. – Benjohn

3

można przekształcić w ten sposób:

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

Dziękuję bardzo! Czy możesz mi powiedzieć, jak dołączyć "dane" do mojej metody? Dostaję "dane nie są typem", gdy koduję je w ten sposób: 'func sendDataToAllPlayers (dane,' – Cesare

+0

Nie ma za co :) Przykro mi, nie łapię twojego pytania, co musisz zrobić? –

+0

Jeśli spojrzysz na drugi punkt zapytania mojego pytania, jest kod funkcji 'sendDataToAllPlayers' Teraz przetłumaczyłem już tę funkcję, ale chciałbym dołączyć stałe 'dane' które zadeklarowałeś w swojej odpowiedzi do mojej metody Swift . Przepraszam za nieporozumienie! – Cesare

17

Z Swift 3.xi 4.0 :

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