首页 > 解决方案 > 为什么集合长度为 1 时 end Index 不为 2?

问题描述

有人能告诉我为什么结束索引是 524289 吗?

let flag = ""
print(flag.startIndex)
print(flag.endIndex)

输出:

Index(_rawBits: 1)
Index(_rawBits: 524289)

标签: swiftstringcollections

解决方案


Swift 字符串不是由整数索引,而是由String.Index对象索引,因此查看 Index 对象的原始数值也没有多大意义。您需要查看索引的内部表示,以了解为什么开始和结束索引分别为 1 和 524289。

根据代码中的注释,布局rawBits看起来是这样的:

 ┌──────────┬───────────────────╥────────────────┬──────────╥────────────────┐
 │ b63:b16  │      b15:b14      ║     b13:b8     │  b7:b1   ║       b0       │
 ├──────────┼───────────────────╫────────────────┼──────────╫────────────────┤
 │ position │ transcoded offset ║ grapheme cache │ reserved ║ scalar aligned │
 └──────────┴───────────────────╨────────────────┴──────────╨────────────────┘

将结束索引 524289 转换为二进制,

1000 00 000000 0000000 1

我们可以看到这个索引是标量对齐的,并且位置为 8。其他的都是 0。另一方面,起始索引 1 只是标量对齐的,其他的都是 0。

8 的位置表明您的字符串的内部表示是 UTF-8 代码单元,因为您的字符串 "" 可以准确地编码为 8 个 UTF-8 字节:

0xf0 0x9f 0x87 0xb5 0xf0 0x9f 0x87 0xb7

推荐阅读