Swift 3中的不安全字节

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。我不明白如何调用unsafe bytes(它并不像将bytes切换为unsafe bytes那么简单)。

因此,我进行了一些研究,有些人建议使用这样的闭包块:

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

我的问题是,在闭包块内放什么来使上述代码工作?我认为我缺少了某些基础知识。我不能使用字节,因为它会再次出现相同的错误。

有人有任何想法吗?谢谢!


可能是重复的问题:'bytes' is unavailable: use withUnsafeBytes instead - Nazmul Hasan
2
你实际上想要实现什么?将字符串转换为数据还是反之?将字符串或数据写入文件?给定了什么,需要计算什么? - Martin R
抱歉,原来这是之前开发人员使用的“Swiftache”中的一部分。我刚刚升级了它,现在没问题了,谢谢! - NullHypothesis
1个回答

2

如果你真的需要使用这个模式,假设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)")
}

谢谢,结果发现这段代码是Swifache(第三方库)的一部分。我下载了最新版本。因为文件被拆分并且之前的开发人员删除了注释,所以在发布时完全忽略了这一点。非常感谢你,你帮助我发现了这个问题(通过对整个代码形式的质疑)。 - NullHypothesis

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