Swift 3中的不安全字节

我正在写一个文件到磁盘,我正在把我的代码转换成Swift 3,并陷入了一些东西。 想看看是否有人能够推动我朝着正确的方向前进。

我目前的代码块是:

open let text: NSString data = possibleData ?? Data() open let fileURL: URL? open let fileEncoding: String.Encoding? fileprivate let data: Data! text = NSString(bytesNoCopy: UnsafeMutableRawPointer(mutating: data.bytes.bindMemory(to: Void.self, capacity: data.count)), length: data.count, encoding: encoding.rawValue, freeWhenDone: false)! 

Swift是说,调用data.bytes是不可用的,我需要使用.unsafebytes来代替。 我不明白你调用不安全的字节的方式(这不像把字节切换到不安全的字节那么简单)

所以我做了一些小小的研究,有人说这样使用闭包模块:

 data.withUnsafeMutableBytes {(bytes: UnsafeMutablePointer<UInt8>)->Void in //work with bytes in here } 

我的问题是,我在闭包块里面放了什么来让我的上面的代码工作? 我想我从根本上失去了一些东西。 我不能使用字节,因为它再次给出相同的错误。

有人有主意吗? 谢谢!

如果你真的需要使用这种模式,假设data是一个var而不是一个let ,你可以做这样的事情:

 let text = data.withUnsafeMutableBytes { bytes in return NSString(bytesNoCopy: bytes, length: data.count, encoding: encoding.rawValue, freeWhenDone: false)! } 

或者,我不知道你为什么要使用NSString ,所以你可以这样做:

 let text = data.withUnsafeMutableBytes { bytes in return String(bytesNoCopy: bytes, length: data.count, encoding: encoding, freeWhenDone: false)! } 

坦率地说,整个模式似乎很脆弱(为什么要强制转换?为什么要使用不安全的指针而不是各种安全模式?)等。 如果你写这个文件,那为什么不直接写Data呢?

 do { try data.write(to: fileURL) } catch { print("Error: \(error.localizedDescription)") }