在日常的开发中,因为String遵循了Collection
协议, 常把String当成数组来处理。
// 如
"abc".count
"abc".isEmpty
但是当我们像数组一样通过索引去取值的时候,Xcode就会报错。
[图片上传失败...(image-e2e55d-1644836833690)]
需要我们通过String.Index
类型来取值才不会报错。
那么为什么String不可以直接通过数字索引
来取值呢?
这里先说结论:
不同字符的Unicode标量不一致,也就不能通过数字索引单纯的通过偏移量去获取指定位置的字符。
在Swift中String是由Character组成的。
那么Character是由什么组成的呢?
在Swift文档中是这样解释的:
The Character type represents a character made up of one or more Unicode scalar values
Character又是由Unicode标量(Unicode scalar)组成。
由于文字的多种多样原因,从效率角度考虑
。 Unicode是长度可变的。
我们会主观的认为🇨🇳和I都是一个字符。
但当我们去打印🇨🇳和I的标量个数时结果确不一样。
[图片上传失败...(image-f29ab8-1644836833690)]
例如有一个字符串是"love🇨🇳666" 在XCode的中查看其内存分布:
[图片上传失败...(image-740f5a-1644836833690)]
中间的 F0 9F 87 A8 F0 9F 87 B3 即为 "🇨🇳"
由此可见。字符串中不同的字符所占据的内存大小也不同。
正因为不同字符在内存中的宽度不一致,也就不能通过数字索引单纯的通过偏移量去获取指定位置的字符。