将字符串写入Swift中的NSOutputStream

时间:2014-10-13 01:06:30

标签: macos swift xcode6

我试图在Swift中向StringNSOutputStream。使用Objective C编写字符串通常可以将其作为NSData传递

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

这不适用于swift

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

这会产生错误

  

' NSData的'不能转换为' UnsafePointer'

表示将数据写入流的行。

你如何在Swift中将字符串写入NSOutputStream?

3 个答案:

答案 0 :(得分:25)

在最近的Swift中,它应该更容易,不再需要NSData。

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

可以将数组作为正确类型的缓冲区进行访问(请参阅withUnsafeBufferPointer)。我认为数组是必要的,因为utf8视图实际上并未实例化为完整数组,而只是原始字符串的视图。

在生产代码中,您应该检查写入输出流的返回值,并根据您的方案检查在写入之前有空格,但此答案的焦点是Swift String的编码,以便可以编写

答案 1 :(得分:15)

这里有两个问题。第一个是您将data传递给outputStream.write()而不是data.bytes(就像您在Objective-C代码中传递[data bytes]一样)。第二个问题是data.bytes返回UnsafePointer<Void>,但NSOutputStream.write()需要UnsafePointer<UInt8>。幸运的是,UnsafePointer有一种方法可以在不同类型之间进行转换:

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

将这些内容组合在一起会使您的代码看起来像这样:

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

答案 2 :(得分:7)

希望这个例子有所帮助。它将字符串写入文档目录。请注意,使用带有可用初始化程序的Swift 1.1测试 outputStream

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

此致