数据范围订阅奇怪的行为

2023-12-07

我在玩 swift 的Data在下面的小代码中:

var d = Data(count: 10)
d[5] = 3
let d2 = d[5..<8]
print("\(d2[0])")

令我惊讶的是,这段代码抛出异常print()而下面的代码则不然:

var d = Data(count: 10)
d[5] = 3
let d2 = d.subdata(in: 5..<8)
print("\(d2[0])")

我以某种方式理解为什么会发生这种情况,但我不明白为什么要这样设计。当我使用subdata()我得到了范围的完整副本,因此索引从以下位置有效0。但是当我使用范围订阅时[],我可以访问请求的范围,而索引与以前相同。所以在我的第一个例子中d2[5] is 3.

但我想知道为什么要这样设计呢?我不想使用以下方式复制我的数据subdata()方法。我只是想通过更好的索引来访问部分数据。

如果将其传递给函数,这尤其会产生意想不到的行为。例如,以下代码会产生意外结果和异常,您可能不容易找出原因:

func testit(idata: Data) {
    if idata.count > 0 {
        print("\(idata.count)")
        print("\(idata[0])")
    }
}
//...
var d = Data(count: 10)
d[5] = 3
let d2 = d[5..<8]
testit(idata: d2)

这段代码确实很奇怪。因为如果你调试你的代码,你会看到print("\(idata.count)") prints 3作为大小idata这是正确的,但是通过以下方式访问它idata[0]创建异常。

这样的设计有什么道理吗?我期待我可以访问结果Datafrom subscribe 从索引 0 开始,但事实并非如此。我可以在不使用的情况下执行此操作吗subdata()它创建数据副本或使用附加参数来传递数据切片的基础?


d[5..<8]回报Data.Slice– 这恰好是Data。一般来说,切片与其基本集合共享索引,如中所述Slice.

这种设计决策的一个可能原因是,它保证为切片添加下标是 O(1) 操作(添加一个offset访问基集合不一定是 O(1),例如不适用于字符串。)

这也很方便,如本示例中所示,在字符串中第二次出现字符之后定位文本:

let string = "abcdefgabcdefg"

// Find first occurrence of "d":
if let r1 = string.range(of: "d") {
    // Find second occurrence of "d":
    if let r2 = string[r1.upperBound...].range(of: "d") {
        print(string[r2.upperBound...]) // efg
    }
}

因此,您绝不能假设集合的索引是从零开始的(除非有记录,至于Array.startIndex). Use startIndex获取第一个索引,或者first获取第一个元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据范围订阅奇怪的行为 的相关文章

  • 如何在 swiftUI (macOS) 中检测按键按下和释放

    除了标题之外没什么可说的 我希望能够在按下按键和释放按键时 在 macOS 上 在 swiftUI 视图中执行操作 在 swiftUI 中是否有任何好的方法可以做到这一点 如果没有 有什么解决方法吗 不幸的是 键盘事件处理是其中一个令人痛苦
  • 如何去掉 UIWebView 上的状态栏背景?

    从 iOS 11 开始 当UIWebView全屏时 状态栏上会出现与屏幕颜色相同的假背景UIWebView背景 有人知道如何摆脱它吗 甚至添加IUWebView到故事板并使其全屏将使状态栏背景出现 我一直在尝试编辑 UIWebView 的大
  • Xcode 错误 - 架构 x86_64 的未定义符号?

    我正在运行 Swift 4 和 Xcode 9 beta 我收到此错误 但我不知道如何解决它 我什至不知道这是什么意思 Undefined symbols for architecture x86 64 T0So22AVCapturePho
  • 删除派生数据文件夹后,Xcode 不断重新创建派生数据文件夹

    自动完成功能在 Xcode 6 中不再起作用 我四处搜索 发现删除派生数据文件夹可以解决此问题 每次我删除它时 它都会回来 然后就不会再自动完成了 有什么建议么 Thanks 没关系 我解决了这个问题 我没有声明需要在类内的方法中使用的变量
  • Swift 中的柯里函数

    我想创建一个返回柯里函数的函数 如下所示 func addTwoNumbers a Int b Int gt Int return a b addTwoNumbers 4 b 6 Result 10 var add4 addTwoNumbe
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt
  • Swift:如何减少 didupdatelocations 调用

    我想出了一些代码来打印我所在位置的地址和邮政编码 这是在 didupdatelocation 函数中完成的 我遇到的唯一问题是 didupdatelocation 函数每秒都会更新该地址 因为这电池效率非常低 所以我一直在寻找使用间隔的方法
  • SwiftUI:状态栏颜色

    有没有办法将 SwiftUI 视图的状态栏更改为白色 我可能错过了一些简单的东西 但我似乎找不到在 SwiftUI 中将状态栏更改为白色的方法 到目前为止我只看到 statusBar hidden Bool 状态栏文本 色调 前景色可以通过
  • 如何防止Apple Watch进入睡眠状态?

    我们正在开发一个 Apple Watch 项目 但如果不被打扰 手表就会进入睡眠状态 有什么办法可以阻止它进入睡眠状态吗 据我所知和有关该主题的其他搜索 目前还没有api可通过编程方式启用或禁用 Apple Watch 的睡眠模式
  • iOS 中的构建对象文件扩展名是什么?

    当我在项目中构建java对象类时 将创建带有 class扩展名的构建文件 并且人类不可读 快速构建文件怎么样 example car java gt build gt car class 构建后会是什么 car swift gt build
  • 致命错误:在字典中发现“地理编码地标”类型的重复键。 (Mapbox 地理编码器)

    我引用 这通常意味着要么该类型违反了 Hashable 的要求 要么此类字典的成员在插入后发生了变化 我正在使用 Mapbox Geocoder 当发生此运行时错误时 我的 XCode 将我带到线程 1 0 swift runtime on
  • 列表不符合 Encodable

    因此 我正在使用领域 并且两个模型之间有以下关系 A unit has many tests Unit model class Unit Object Decodable objc dynamic var id String let tes
  • Swift - 选择值后隐藏 pickerView

    我发现了类似的问题 他们的答案很有帮助 但我坚持最后一件事 我试图在点击字段时显示 pickerView 然后选择数据时 我希望 pickerView 隐藏 我可以从 pickerView 获取数据来隐藏 但是 pickerView 后面仍
  • Swift 中具有透明背景的按钮边框

    我怎样才能做一个UIButton边框看起来像下图 入门 按钮一样具有透明背景吗 我应该如何使用情节提要来实现这一点 或者如何以编程方式实现这一点 设置backgroundColor to clearColor使按钮透明 例如尝试下面的代码
  • 无法转换“UINavigationController”类型的值

    我正在为我的应用程序实现一个搜索界面 因此基本上我会将搜索关键字从一个 ViewController 传递到另一个 ViewController 我已经多次进行过这种类型的参数传递 但这次似乎有些奇怪 目标 ViewController 嵌
  • 将数字分解为单个数字的数组

    如果我有整数 123 并且我想将数字分解为数组 1 2 3 最好的方法是什么 我已经搞乱了很多 并且我有以下工作 var number 123 var digits Array String number map Int strtoul S
  • Xcode 9 中的“addingPercentEncoding”是否损坏?

    在 Swift 3 x 和 Xcode 9 beta 2 中 使用addingPercentEncoding https developer apple com documentation swift string 1690785 addi
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector

随机推荐

  • 使用 JavaScript 从 url 获取数组

    我有带有参数的 URL 我可以获取除数组之外的所有参数 这是我的 URL 解码 name myname type Restaurant Cuisine Moderne Cr ative heure 06 00 06 30 nbrPers 1
  • 找不到 Pyinstaller GLIBC_2.15

    在 Linux 32 位 Ubuntu 11 上生成了一个可执行文件 并在 32 位 Ubuntu 10 上对其进行了测试 但失败并显示 GLIBC 2 15 未找到 Cyrhon 常见问题解答部分说 在 Linux 下 我收到与 libc
  • 多个项目的区域 - 在子项目中找不到视图

    我一直在关注 MSDN 上的这个指南 使用多个项目创建 ASP NET MVC Areas 应用程序 由于 ASP NET MVC 2 0 只是预览版 人们可能会认为存在一些错误 我的问题是 它根本不起作用 至少不是应该的方式 设置完所有内
  • 在elasticsearch 5中聚合_field_names

    我正在尝试聚合 ES 5 中的字段名称 如中所述不同键上的 Elasticsearch 聚合但那里描述的解决方案不再有效 我的目标是获取所有文档的密钥 映射是默认映射 Data PUT products product 1 param fi
  • 有没有办法暂停气流 DagRun?

    有没有办法暂停 Airflow 中的特定 DagRun 我希望能够对单个 DAG 进行多个同时执行的运行 并且我希望能够在某些点单独暂停这些运行 取消暂停 暂停功能似乎仅在 DAG 级别起作用 并暂停 取消所有 DagRun 针对该 DAG
  • 将 Keras 增强数据保存为 numpy 数组

    使用喀拉斯图像数据生成器 我们可以将增强图像保存为 png 或 jpg for X batch y batch in datagen flow train data train labels batch size batch size sa
  • ES6类构造函数不能像普通函数一样调用的原因是什么?

    ES6 类构造函数不能作为普通函数调用 根据 ES6 aTypeError完成此操作后应提出 我曾经认为类只是原型中的构造函数 函数的语法糖 但这使得它稍微不那么重要 我想知道 这背后的理由是什么 除非我错过了什么 否则它会阻止使用自定义调
  • 使用 Python 将纬度、经度、值 CSV 转换为栅格地图

    如果我有一个包含纬度 经度和值字段的 CSV 数据集 那么使用 python 生成栅格地图的最佳方法是什么 栅格 Z 字段可以是该表中的任何列 L5 L6 L7 L8 L9 L10 L11 L12 L13 L14 LAT LON 3 571
  • 在c#中解析阿拉伯日期

    在我正在编写的应用程序中 我想解析 C 中阿拉伯语的特定日期 例如 日期可能如下所示 但我想要这个输出 30 12 1989 我的问题是如何在 C 中执行此操作以从此字符串中获取 DateTime 对象 谁能告诉我该怎么做 东方阿拉伯数字不
  • 带有字母 A-Z 或其他自定义范围的 jQuery UI Spinner

    有没有办法自定义 jQuery UI 微调器 以便可以使用 A Z 字母 或任何自定义范围 是的 这是可能的 这是一个使用 A Z 的简单示例 改编自提供的时间示例 widget ui alphaspinner ui spinner opt
  • Javascript 中的 RTL 确认和警报

    你能做一个confirm or alert显示其消息 RTL 并右对齐 尝试在消息的开头添加以下内容 u200f u200f 例如 alert u200f u200f message or confirm u200f u200f messa
  • 如何向 PropertySheet 添加夹具?

    我有一个类源自CPropertySheet 我想在对话框的右下角插入一个 夹具 我的对话框已经可以调整大小 我只是无法插入夹具 不知道有没有什么特殊的API可以做到这一点 一种选择是手动绘制它 然后覆盖ON WM NCHITTEST并返回H
  • 如何跟踪递归函数 C++

    include
  • 如何将 MySQL 触发器异常/失败信息存储到表或变量中

    我被困在某个地方 需要你的帮助 Scenario 我有两个数据库 即test db1 and test db2并有users桌子上有他们两个 两个数据库最初都是空的 0 行 Here s users表架构 DROP TABLE IF EXI
  • 从 pandas 数据框创建列表字典

    我正在尝试创建基于 pandas 数据框的列表字典 我需要一个列表字典来传递给我的 Plotly 仪表板 In df head Model Make Ford F 150 Ford Escape Ford Mustang Jeep Gran
  • Facebook iOs sdk iphone:从多个视图控制器调用

    我按照 facebook 开发文档的官方指南从我的 iPhone 应用程序实现 SSO 但所有持有 Facebook 类的成员都在同一个视图控制器中 现在考虑我想登录一个导航控制器的第一个视图控制器 然后从同一导航控制器的第三个视图控制器调
  • 运行应用程序时的 IntelliJ MyClass.class(没有此类文件或目录)

    我正在尝试在 IntelliJ 上运行我的 Android 应用程序 我从现有源创建了一个项目 并且已正确附加 SDK 一切运行正常 但当我尝试运行时 它会记录消息 Error MyClass class No such file or d
  • 找到 C 列的最后一行(然后 A 列和 B 列有不同的行大小)?

    如何找到 C 列最后使用的单元格 示例 Sheet1 Col A 和 Col B 有 1200 行 而 Col C 只有 1 行 ColA ColB ColC 1 1 1 2 2 empty 1200 1200 empty 这是我不成功的测
  • ASP.net 有效渲染元标记

    HTML 隐藏代码 MetaDescription Attributes content ThisBlog MetaDescription 这呈现为 As per 这个答案它不需要有 ID 属性 并以 gt 我怎样才能让它以这种方式渲染 我
  • 数据范围订阅奇怪的行为

    我在玩 swift 的Data在下面的小代码中 var d Data count 10 d 5 3 let d2 d 5 lt 8 print d2 0 令我惊讶的是 这段代码抛出异常print 而下面的代码则不然 var d Data c