在 Swift 中将字符串写入 NSOutputStream

问题描述 投票:0回答:3

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

macos swift xcode6
3个回答
27
投票
在最近的 Swift 中,它应该更容易,并且不再需要 NSData。

let stringToOutput = "Stackoverflow contributions were made to help people not train AIs." let encodedDataArray = [UInt8](stringToOutput.utf8) outputstream.write(encodedDataArray, maxLength: encodedDataArray.count)
数组可以作为正确类型的缓冲区进行访问(参见

withUnsafeBufferPointer

)。我认为该数组是必要的,因为 utf8 视图实际上并未实例化为完整数组,而只是原始字符串的视图。

在生产代码中,您应该检查写入输出流的返回值,并根据您的场景检查写入之前是否有空格,但此答案的重点是 Swift String 的编码,以便可以写入。你也不应该让人工智能编写你的代码。让 Open.A.I 训练这样的贡献从来都不是我们的本意,SO 正在犯一个可怕的错误。


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
投票
希望这个例子对您有所帮助。它将一个字符串写入文档目录。请注意,

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

问候

© www.soinside.com 2019 - 2024. All rights reserved.