在 Swift 中将字符串写入 NSOutputStream

Posted

技术标签:

【中文标题】在 Swift 中将字符串写入 NSOutputStream【英文标题】:Writing a String to an NSOutputStream in Swift 【发布时间】:2014-12-07 12:35:51 【问题描述】:

我正在尝试在 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”

用于将数据写入流的行。

如何?

【问题讨论】:

【参考方案1】:

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

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

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

在生产代码中,您应该检查写入输出流的返回值,并根据您的场景检查写入前是否有空间,但此答案的重点是 Swift String 的编码,以便可以写入.

【讨论】:

【参考方案2】:

这里有两个问题。首先是您将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)

【讨论】:

【参考方案3】:

希望这个例子能有所帮助。它将一个字符串写入文档目录。请注意,outputStream 是使用带有可失败初始化程序的 Swift 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()

问候

【讨论】:

以上是关于在 Swift 中将字符串写入 NSOutputStream的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 JSON 转换为数据类型?

如何在 Swift 中将文件写入位于 Apple Files App 中的文件夹

如何在 Swift 中将文件写入位于 Apple 文件应用程序的文件夹中

swift 在swift中将uint8转换为字符串

如何在 Swift 中将 Int 转换为字符

Swift:在 UIbutton 中将 fontawesome 图标与字符串混合