ios - Swift 3 中的不安全字节

标签 ios swift xcode swift3

我正在将文件写入磁盘,并且正在将我的代码转换为 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。我不明白你调用不安全字节的方式(它不是将字节切换为不安全字节那么简单)

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

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

我的问题是,我要在闭包 block 中放入什么才能让上面的代码正常工作?我想我从根本上错过了一些东西。我不能使用字节,因为它再次给出相同的错误。

有人有什么想法吗?谢谢!

最佳答案

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

关于ios - Swift 3 中的不安全字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40565415/

相关文章:

ios - 如何更改Xcode sdk编译版本

ios - Swift:按下按钮后,如何将来自三个独立文本字段的数据发布到自定义单元格中的标签上?

ios - 如何让 Xcode 知道目标 iPhone 使用哪个资源?

Swift 语言 : nil check, 并且如果是则实例化新对象

xcode - iOS 模拟器 - 启动服务错误 0

ios - Xcode 对成员 'init' 的模糊引用

ios - HTML5 视频并不总是在 iPhone 上自动播放

ios - UIWebView FinishLoad/检测问题

iphone - 如何将 -lxml2 添加到链接器标志?

ios - Realm() 究竟是如何工作的?