स्विफ्ट 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
)