स्विफ्ट में NSData से एक स्ट्रिंग को इनिशियलाइज़ कैसे करें


173

मैं NSDataस्विफ्ट से एक स्ट्रिंग इनिशियलाइज़ करने की कोशिश कर रहा हूं ।

में NSString कोको प्रलेखन एप्पल कह रहा है तो आप इस का उपयोग करने के:

 init(data data: NSData!, encoding encoding: UInt)

हालाँकि Apple ने उपयोग के लिए कोई उदाहरण शामिल नहीं किया या कहाँ रखा गया init

मैं निम्नलिखित कोड को ऑब्जेक्टिव-सी से स्विफ्ट में बदलने की कोशिश कर रहा हूं

NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

मैं बहुत से संभावित सिंटैक्स की कोशिश कर रहा हूं जैसे कि निम्नलिखित (निश्चित रूप से यह काम नहीं किया):

var string:NSString!
string = init(data: fooData,encoding: NSUTF8StringEncoding)

जवाबों:


224

यह है कि आप कैसे शुरू करना चाहिए NSString:

स्विफ्ट 2.X या पुराने

let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)

स्विफ्ट 3 या नया:

let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)

यह डॉक सिंटैक्स की व्याख्या करता है।


2
ध्यान दें कि आपको उस तरह "डेटा" और "एन्कोडिंग" दोहराने की आवश्यकता नहीं है।
jbg

19
होना चाहिएlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
यास टी।

14
क्या NSDataएक स्विफ्ट String( सीधे बदले NSString) में बदलना संभव है ?
ma11hew28

3
@MattDiPasquale var स्विफ्टस्ट्रिंग = NSString (डेटा: NSData !, एन्कोडिंग: UInt) के रूप में! स्ट्रिंग है कि सभी
Gintama

11
@MattDiPasquale उपरोक्त मजबूर कलाकारों को अनदेखा करें; Stringa NSString... ये सभी होने चाहिए:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond

278

यह लागू किया गया कोड है:

स्विफ्ट 3.0 में:

var dataString = String(data: fooData, encoding: String.Encoding.utf8)

या केवल

var dataString = String(data: fooData, encoding: .utf8)

पुराना स्विफ्ट संस्करण:

स्विफ्ट 2.0 में:

import Foundation

var dataString = String(data: fooData, encoding: NSUTF8StringEncoding)

स्विफ्ट में 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)

स्विफ्ट 2 में ऐसा करने का एक अलग तरीका है
डिपार्टमेन्ट बी

3
एक स्विफ्ट 2.0 संस्करण के साथ-साथ अब
सनकास

क्या आप स्विफ्ट 3.0 रास्ता जानना चाहेंगे? error: use of unresolved identifier 'NSUTF8StringEncoding'
ग्लेन 'देवलियास'

2
साथ ही एक स्विफ्ट 3.0 संस्करण जोड़ा गया। लानत है, सेब जैसे सामान बदलना!
सनकस

1
आपको स्विफ्ट के एक विशिष्ट संस्करण के खिलाफ संकलन करना होगा, इसलिए आपका कोड सभी के बीच लिखा होगा 2.x या 3.x। इसके अलावा, 3.0 संस्करण के साथ ध्यान दें कि आप इसका उपयोग करके इसे छोटा कर सकते हैं var dataString = String(data: fooData, encoding: .utf8)
रटटोपिया

15

स्विफ्ट 2.0

ऐसा लगता है कि स्विफ्ट 2.0 ने वास्तव में String(data:encoding:)आयात करते समय स्ट्रिंग एक्सटेंशन के रूप में पेश किया है Foundation। मुझे ऐसी कोई जगह नहीं मिली जहाँ यह प्रलेखित हो, विचित्र रूप से पर्याप्त हो।

(प्री स्विफ्ट 2.0) लाइटवेट विस्तार

यहां उपयोग किए बिना एक कॉपी-पेस्ट करने योग्य थोड़ा विस्तार है NSString, चलो मध्य-पुरुष को काट लें।

import Foundation

extension NSData
{
    var byteBuffer : UnsafeBufferPointer<UInt8> { get { return UnsafeBufferPointer<UInt8>(start: UnsafeMutablePointer<UInt8>(self.bytes), count: self.length) }}
}

extension String
{
    init?(data : NSData, encoding : NSStringEncoding)
    {
        self.init(bytes: data.byteBuffer, encoding: encoding)
    }
}

// Playground test
let original = "Nymphs blitz quick vex dwarf jog"
let encoding = NSASCIIStringEncoding

if let data = original.dataUsingEncoding(encoding)
{
    String(data: data, encoding: encoding)
}

यह आपको एक एक्सेस data.byteBufferप्रकार भी देता है, इसलिए आप उन सभी शांत ऑपरेशनों को कर सकते हैं जो अनुक्रमों के साथ भी कर सकते हैं, जैसे कि एreduce { $0 &+ $1 } चेकसम के लिए ।

टिप्पणियाँ

मेरे पिछले संपादन में, मैंने इस पद्धति का उपयोग किया:

var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)

इस दृष्टिकोण के साथ समस्या यह है कि मैं एक नई सरणी में जानकारी की एक प्रतिलिपि बना रहा हूं, इस प्रकार, मैं बाइट्स की मात्रा को डुप्लिकेट कर रहा हूँ है (विशेष रूप से: encoding size * data.length)


4

स्विफ्ट के तीसरे संस्करण के बाद से आप निम्न कार्य कर सकते हैं:

let desiredString = NSString(data: yourData, encoding: String.Encoding.utf8.rawValue)

सुनकस ने सलाह दी।



2

एक्सटेंशन पर आधारित एक और उत्तर (लड़का मुझे यह जावा में याद आता है):

extension NSData {
    func toUtf8() -> String? {
        return String(data: self, encoding: NSUTF8StringEncoding)
    }
}

तब आप इसका उपयोग कर सकते हैं:

let data : NSData = getDataFromEpicServer()
let string : String? = data.toUtf8() 

ध्यान दें कि स्ट्रिंग वैकल्पिक है, प्रारंभिक NSDataUtf8 के लिए अपरिवर्तनीय हो सकती है।


0

उद्देश्य सी

NSData *myStringData = [@"My String" dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *myStringFromData = [[NSString alloc] initWithData:myStringData encoding:NSUTF8StringEncoding];
NSLog(@"My string value: %@",myStringFromData);

तीव्र

//This your data containing the string
   let myStringData = "My String".dataUsingEncoding(NSUTF8StringEncoding)

   //Use this method to convert the data into String
   let myStringFromData =  String(data:myStringData!, encoding: NSUTF8StringEncoding)

   print("My string value:" + myStringFromData!)

http://objectivec2swift.blogspot.in/2016/03/coverting-nsdata-to-nsstring-or-convert.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.