gpt4 book ai didi

swift - 在 Data 实例上使用 [] 运算符时出现异常

转载 作者:可可西里 更新时间:2023-11-01 01:09:18 25 4
gpt4 key购买 nike

这个 Swift 小片段在最后一个任务中使 Xcode 9.2 playground 崩溃,尽管缓冲区仍保留 23 个字节。知道为什么会这样吗?

import Cocoa

var str = "01234567890123456789012345678901234567"
var buffer = Data()

if let data = str.data(using: .utf8) {
buffer.append(data)
buffer = buffer[15..<38]
buffer = buffer[2..<23]
}

最佳答案

看起来这是由 SDK 错误或编译器优化引起的,两者都试图避免不必要的数据复制(也称为写时复制)。在有问题的行上设置断点并检查 buffer 会发现如下内容:

enter image description here

所以缓冲区指向相同的数据存储,但不同的切片,并且尝试访问切片之外会导致崩溃。

将有问题的行更改为 buffer = buffer[17..<38] 会使崩溃消失。

我不知道为什么按范围下标会导致 Data,如果在代码的另一个(可能不相关的)部分使用而不知道它们正在处理切片,则可能会导致崩溃。其他集合,如 Array 具有专用的切片类型,您可以期望它们具有各种有效索引。

这是一个支持上述想法的简单例子:

func printFirstByte(of data: Data) {
print(data[0])
}

let str = "01234567890123456789012345678901234567"
if let data = str.data(using: .utf8) {
printFirstByte(of: data[15..<38]) // this call crashes
}

另一方面,我们在 Data 类型上确实有一个 startIndex 和一个 endIndex 属性,但是这只会让使用 Data 实例变得更加困难,因为在发送之前我们需要将 Data 切片从零开始并不明显它到不知道此行为的旧代码。

关于swift - 在 Data 实例上使用 [] 运算符时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073718/

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