2015-02-23 8 views
10

ऑब्जेक्टिव-सी में मैंस्विफ्ट में इंटेल को एनएसडीटा में कैसे परिवर्तित करें?

  1. के लिए निम्न कोड का उपयोग NSData, बाइट्स की एक पैकेट में एक Int चर बदलें।

    int myScore = 0; 
    NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)]; 
    
  2. एक विधि में बदल NSData चर का प्रयोग करें।

    var myScore : Int = 0 
    
    func sendDataToAllPlayers(packet: Int!, 
          withDataMode mode: GKMatchSendDataMode, 
          error: NSErrorPointer) -> Bool { 
    
          return true 
    } 
    

    हालांकि, मैं एक NSData में एक Int चर बदलने और यह एक एक विधि का उपयोग करने में सक्षम नहीं हूँ:

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

मैं स्विफ्ट में ऑब्जेक्टिव-सी कोड में परिवर्तित करने की कोशिश की। मैं उसे कैसे कर सकता हूँ?

+1

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

उत्तर

20

IntNSData में बदलने के लिए :

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

आईएमओ ऐसे 'डेटा' पोर्टेबल नहीं होगा (अतिरिक्त मेटाडाटा के बिना स्थानांतरित नहीं किया जाना चाहिए) विभिन्न बाइट ऑर्डर वाले उपकरणों के बीच (देखें [यहां] (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/टीपी 40008304-सीएच 9-एसड 27) _गेम सेंटर प्रोग्रामिंग गाइड में चर्चा, _ लेकिन यह संग्रह या प्लिस्ट या कुछ और अधिक मजबूत प्रारूप का उपयोग करने के लिए अधिक समझदार प्रतीत होता है। – Rob

+0

बाइट ऑर्डर को एक विशिष्ट अंतराल के लिए मजबूर करने के लिए आप 'score.bigEndian' या' score.littleEndian' का उपयोग कर सकते हैं। तब डेटा एक पर लिखे जाने वाले आर्किटेक्चर के बीच संगत होगा और दूसरे पर पढ़ा जाएगा। – Benjohn

3

आप इस तरह से परिवर्तित कर सकते हैं: स्विफ्ट 3.x और 4.0 के साथ

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

बहुत बहुत धन्यवाद! क्या आप कृपया मुझे बताएं कि मेरी विधि में 'डेटा' कैसे शामिल करें? मुझे 'डेटा एक प्रकार नहीं है' जब मैं इसे इस तरह से कोड करता हूं: 'func sendDataToAllPlayers (डेटा, ' – Cesare

+0

आपका स्वागत है :) क्षमा करें, मुझे आपका प्रश्न नहीं है, आपको क्या करना है? –

+0

यदि आप मेरे प्रश्न के दूसरे बुलेट बिंदु को देखते हैं तो 'sendDataToAllPlayers' फ़ंक्शन का एक कोड है, मैंने पहले से ही उस फ़ंक्शन का अनुवाद किया है, लेकिन मैं आपके स्विफ्ट विधि में आपके उत्तर में निरंतर 'डेटा' को शामिल करना चाहता हूं । गलतफहमी के लिए खेद है! – Cesare

17

:

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

इसे वापस बदलने के लिए:

var myScore: NSInteger = 0 
let data = NSData(bytes: &myScore, length: sizeof(NSInteger)) 
संबंधित मुद्दे