2014-10-13 7 views
12

में एक NSOutputStream के लिए एक स्ट्रिंग लिखना मैं String को स्विफ्ट में NSOutputStream पर लिखने की कोशिश कर रहा हूं। NSData के रूप में यह पारित करके स्ट्रिंग्स कि उद्देश्य सी के साथ जिस तरह से आम तौर पर काम करता है लेखनस्विफ्ट

NSData *data = [[NSData alloc] initWithData:[mystring dataUsingEncoding:NSASCIIStringEncoding]]; 
[outputStream write:[data bytes] maxLength:[data length]]; 

यह तेज

var data: NSData = mystring.dataUsingEncoding(NSUTF8StringEncoding)! 
outputStream.write(data, maxLength: data.length) 

इस त्रुटि

'NSData' पैदावार साथ काम नहीं करता परिवर्तनीय नहीं है 'UnsafePointer'

दा लिखने वाली रेखा के लिए धारा में टा।

स्विफ्ट में एनएसओटपुटस्ट्रीम के लिए आप स्ट्रिंग कैसे लिखेंगे?

उत्तर

14

यहाँ दो मुद्दों कर रहे हैं। पहला यह है कि आप data से outputStream.write() और data.bytes (जैसे आप अपने उद्देश्य-सी कोड में [data bytes] पारित कर चुके हैं) पास कर रहे हैं। दूसरा मुद्दा यह है कि data.bytes एक UnsafePointer<Void> देता है, लेकिन NSOutputStream.write()UnsafePointer<UInt8> लेता है। इस तरह अपने कोड नज़र कुछ बनाता

/// Convert from a UnsafePointer of a different type. 
/// 
/// This is a fundamentally unsafe conversion. 
init<U>(_ from: UnsafePointer<U>) 

उन चीजों को एक साथ लाना: सौभाग्य से, UnsafePointer एक तरीका प्रकार के बीच परिवर्तित करने के लिए है यह और भी आसान होना चाहिए

let data: NSData = mystring.dataUsingEncoding(NSUTF8StringEncoding)! 
outputStream.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length) 
+0

के साथ काम नहीं कर रहा है धन्यवाद माइक एस – Lukas

7

आशा है कि यह उदाहरण मदद करता है। यह दस्तावेज़ निर्देशिका में एक स्ट्रिंग लिखता है। ध्यान दें कि आउटपुटस्ट्रीम का उपयोग स्विफ्ट 1.1 का उपयोग फ़ेबल प्रारंभकर्ता के साथ किया जाता है।

var myString = "Hello world!" 
var docPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
var path = docPath.stringByAppendingPathComponent("doc") 
var outputStream = NSOutputStream(toFileAtPath: path, append: false) 
var data: NSData = myString.dataUsingEncoding(NSUTF8StringEncoding)! 
var buffer = [UInt8](count:data.length, repeatedValue:0) 
data.getBytes(&buffer) 
outputStream?.open() 
outputStream?.write(&buffer, maxLength: data.length) 
outputStream?.close() 

सादर

+2

स्विफ्ट 3 –

22

हाल स्विफ्ट में और NSData अब नहीं है जरूरत है।

let s = "String to encode" 
let encodedDataArray = [UInt8](s.utf8) 
outputstream.write(encodedDataArray, maxLength: encodedDataArray.count) 

सरणी उनके प्रकार सही की बफ़र्स (withUnsafeBufferPointer देखें) के रूप में पहुँचा जा सकता है। मुझे लगता है कि सरणी आवश्यक है क्योंकि utf8 व्यू वास्तव में पूर्ण सरणी के रूप में तत्काल नहीं है बल्कि मूल स्ट्रिंग में केवल एक दृश्य है।

उत्पादन कोड में आपको आउटपुट स्ट्रीम में लिखने के वापसी मूल्य की जांच करनी चाहिए और अपने परिदृश्य के आधार पर जांच के पहले जगह है लेकिन इस उत्तर का फोकस स्विफ्ट स्ट्रिंग का एन्कोडिंग है ताकि यह हो सके लिखा हुआ।