首页 文章

将字符串写入Swift中的NSOutputStream

提问于
浏览
12

我正试图在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写一个String?

3 回答

  • 25

    这里有两个问题 . 第一个是你将 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)
    
  • 7

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

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

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

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

  • 15

    希望这个例子有所帮助 . 它将字符串写入文档目录 . 请注意,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()
    

    问候

相关问题