为什么Swift中字符串不能直接通过索引取字符?

2022-02-14  本文已影响0人  liaoworkinn

在日常的开发中,因为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 即为 "🇨🇳"
由此可见。字符串中不同的字符所占据的内存大小也不同。

正因为不同字符在内存中的宽度不一致,也就不能通过数字索引单纯的通过偏移量去获取指定位置的字符。

参考文章:
NSString 与 Unicode
Swift Document

上一篇下一篇

猜你喜欢

热点阅读