2015-02-23 4 views
10

В Objective-C Я использую следующий код дляКак преобразовать Int в NSData в Swift?

  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 в Swift:

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 –

ответ

20

Чтобы преобразовать 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)") 
} 

Чтобы преобразовать его обратно:

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

IMO такие «данные» не будут переносимыми (не должны передаваться без дополнительных метаданных) между устройствами с разными порядками байтов (см. [Здесь] (http://stackoverflow.com/questions/28662770/how-do-i- отправить-данных из-а-gkplayer-к-другому-в-матч/28727335 # 28727335)). – Drux

+0

Я действительно согласен. Я только смоделировал свой ответ после [отправки данных другим игрокам] (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/Matchmaking/Matchmaking.html#//apple_ref/doc/uid/TP40008304-CH9-SW27) в Руководстве по программированию _Game Center _, но представляется более разумным использовать архив или plist или какой-либо другой более надежный формат. – Rob

+0

Вы можете использовать 'score.bigEndian' или' score.littleEndian', чтобы заставить порядок байтов иметь определенную сущность. Затем данные будут совместимы между архитектурами, которые могут быть написаны на одном, и читать по другому. – Benjohn

3

Вы можете преобразовать таким образом:

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

Большое спасибо! Можете ли вы рассказать мне, как включить «данные» в мой метод? Я получаю 'data is not a type', когда я его кодирую следующим образом:' func sendDataToAllPlayers (data, ' – Cesare

+0

Добро пожаловать :) Извините, я не понимаю ваш вопрос, что вам нужно делать? –

+0

Если вы посмотрите на вторую маркерную точку моего вопроса, то есть код функции 'sendDataToAllPlayers' Теперь я уже перевел эту функцию, но я хотел бы включить константу' data', которую вы указали в своем ответе, в мой метод Swift , Извините за недопонимание! – Cesare

17

С Swift 3.x и 4.0 :

var myInt = 77 
var myIntData = Data(bytes: &myInt, 
        count: MemoryLayout.size(ofValue: myInt)) 
Смежные вопросы