Swift 4个数据读取选项

Swift 4 Data reading options

此 Objective C 代码行到 Swift 4 的正确翻译是什么?

NSData *mappedData =
  [NSData dataWithContentsOfURL:fileURL
                        options:NSDataReadingMappedAlways + NSDataReadingUncached
                          error:&error];

我试过了,但没有编译:

 Data(contentsOf: fileUrl, options: Data.ReadingOptions.dataReadingMapped | Data.ReadingOptions.uncached)

你可以试试

do {

     // note it runs in current thread

    let data = try Data(contentsOf:fileURL, options: [.alwaysMapped , .uncached ] )

    print(data)

}
catch {

    print(error)
}

试试看

do {
    guard let fileURL = URL(string: "") else {
       return
    }
    let data = try Data(contentsOf: fileURL , options: Data.ReadingOptions(rawValue: Data.ReadingOptions.alwaysMapped.rawValue | Data.ReadingOptions.uncached.rawValue))
     print(data)
} catch {
    //print(error)
}

您的 Swift 代码有两个问题。

首先,options 需要作为数组的元素传入,(不像您那样使用按位或运算符 - 该方法在几个 Swift 版本之前已被弃用):

[.dataReadingMapped, .uncached]

其次,此初始化程序可能会引发异常,因此您需要考虑到这一点。

有两种方法可以做到这一点:在 try-catch 块内,或通过可选链接。

如果您想要捕获和响应特定错误的能力,请使用 try-catch 块:

do {
    let data = try? Data(contentsOf: fileURL, options: [.dataReadingMapped, .uncached])
    // Do something with data
} catch {
    print(error)
}

如果您不关心从特定错误中恢复,您可以使用可选链接:

if let data = try? Data(contentsOf: fileURL, options: [.dataReadingMapped, .uncached]) {
    // Do something with data
} else {
    // It failed. Do something else.
}

如果您有兴趣从 Objective-C 切换到 Swift,我推荐 Apple 的 Swift 编程语言书:

https://itunes.apple.com/us/book/swift-programming-language/id881256329