2014-10-13 19 views
12

Tôi đang cố gắng viết một String vào một số NSOutputStream trong Swift. Viết Strings như vậy với Objective C thường hoạt động bằng cách đi qua nó như NSDataViết một chuỗi vào NSOutputStream trong Swift

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

này không hoạt động với nhanh chóng

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

này mang lại các lỗi

'NSData' không mui trần thành 'UnsafePointer'

cho dòng viết vào luồng.

Làm cách nào bạn viết một chuỗi vào NSOutputStream trong Swift?

Trả lời

14

Có hai vấn đề ở đây. Đầu tiên là bạn đang đi qua data đến outputStream.write() và không phải data.bytes (như bạn đã vượt qua [data bytes] trong mã Mục tiêu-C). Vấn đề thứ hai là data.bytes trả về một UnsafePointer<Void>, nhưng NSOutputStream.write() mất một số UnsafePointer<UInt8>. May mắn thay, UnsafePointer có một cách để chuyển đổi giữa các loại:

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

Đưa những thứ đó lại với nhau làm cho mã của bạn nhìn một cái gì đó như thế này:

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

Cảm ơn bạn Mike S – Lukas

7

Hy vọng ví dụ này sẽ giúp ích. Nó viết một chuỗi vào thư mục tài liệu. Lưu ý rằng outputStream được kiểm tra bằng Swift 1.1 với trình khởi tạo có sẵn.

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() 

Trân

+2

Không hoạt động với Swift 3 –

22

Trong Swift gần đây nó phải được dễ dàng hơn và NSData không còn cần thiết.

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

Mảng có thể được truy cập như bộ đệm đúng loại của chúng (xem withUnsafeBufferPointer). Tôi nghĩ rằng mảng là cần thiết vì xem utf8 là không thực sự instantiated như là một mảng đầy đủ nhưng chỉ là một cái nhìn vào chuỗi ban đầu.

Trong mã sản xuất, bạn nên kiểm tra giá trị trả về của ghi vào luồng đầu ra và tùy thuộc vào kịch bản của bạn kiểm tra có không gian trước khi viết nhưng trọng tâm của câu trả lời này là mã hóa của chuỗi Swift để có thể bằng văn bản.

Các vấn đề liên quan