在Swift中向NSOutputStream写入字符串

12

我正在尝试用Swift将String写入NSOutputStream。使用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个回答

27

在最近的Swift版本中,这将变得更加容易,而且不再需要NSData。

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

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

在生产代码中,您应该检查输出流的写入返回值,并根据您的场景检查写入之前是否有足够的空间,但本答案的重点是编码Swift字符串,以便可以将其写入。


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)

8
希望这个例子能够帮到你。它会将一个字符串写入文档目录。请注意,使用可失败的初始化器来测试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()

问候


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接