gpt4 book ai didi

swift - 处理 NSData (Data) 范围异常

转载 作者:行者123 更新时间:2023-11-28 12:38:34 26 4
gpt4 key购买 nike

使用 NSData(或 Data)通过 getBytes(copyBytes)读取字节可能会抛出 NSRangeException。我不知道如何捕获它们。

我知道对于 NS 类,包括 NSData,我必须使用 Objective-C 包装器来捕获和处理异常,但我有点惊讶地看到Data 还会抛出 Swift 无法原生处理的异常。

我是否遗漏了一些明显的东西?有什么办法可以捕捉到那些使用纯 Swift 的人吗?或者是否有任何其他方法可以抛出 Swift 可处理的错误?

失败的代码示例(实际上我使用的是从文件创建的数据)

// Using NSData

let dataBytes:[UInt8] = [0xff, 0x00, 0x11, 0x22]
let data = NSData(bytes: dataBytes, length: dataBytes.count)
let dataRange = NSRange(location: 2, length: 4)

var result = [UInt8](repeating: 0, count: 4)

do
{
try data.getBytes(&result, range: dataRange)
print("OK")
}
catch
{
print("FAIL")
}


// Using Data

let dataBytes:[UInt8] = [0xff, 0x00, 0x11, 0x22]
let data = Data(dataBytes)
let dataRange = Range(2..<6)

var result = [UInt8](repeating: 0, count: 4)

do
{
try data.copyBytes(to: &result, from: dataRange)
print("OK")
}
catch
{
print("FAIL")
}

注意:有问题的代码还显示了两个警告(正如预期的那样,因为 Swift 无法处理这些警告)但我添加了那些 try...catch block 只是为了显示我想要使用的内容.

No calls to throwing functions occur within 'try' expression

'catch' block is unreachable because no errors are thrown in 'do' block

最佳答案

您需要检查您使用的范围的上限索引是否超出数据范围:

if dataRange.upperBound <= data.count {
data.copyBytes(to: &result, from: dataRange)
}

您可以将 Data 更像是一个数组/集合。 copyBytes 将在没有可捕获异常的情况下失败,原因与 anArray[1] 对于单个项目数组将失败相同。

关于swift - 处理 NSData (Data) 范围异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40138925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com