美文网首页
为什么Swift中字符串不能直接通过索引取字符?

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

作者: liaoworkinn | 来源:发表于2022-02-14 19:08 被阅读0次

    在日常的开发中,因为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

    相关文章

      网友评论

          本文标题:为什么Swift中字符串不能直接通过索引取字符?

          本文链接:https://www.haomeiwen.com/subject/hbxhlrtx.html