swift - 为什么集合长度为 1 时 end Index 不为 2?
问题描述
有人能告诉我为什么结束索引是 524289 吗?
let flag = ""
print(flag.startIndex)
print(flag.endIndex)
输出:
Index(_rawBits: 1)
Index(_rawBits: 524289)
解决方案
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
推荐阅读
- android - 在 BottomNavigationView 中没有椭圆的标签
- powerbi - 使用 PowerBI 基于两列的重复数据删除
- oracle - 将 3 个查询合并为一个子查询
- ajax - 如何接收其他数据表列
- java - 如何在 aws linux 机器上为 tomcat 服务器安装 ssl 证书
- android - Xamarin Android Web 视图文件选择器
- jsp - 如何将一个jsp页面的数据库检索值发送到另一个jsp页面
- c# - 从 WebApplicaion Identity 访问 webAPI 的区域/帮助
- angular - Angular 6 库中的动态导入
- mysql - mysql docker容器以代码1退出