2016-06-16 46 views
3

我知道Swift字符串不能被整数值索引。我记得它,我使用规则。但我从来没有完全理解它背后的机制。为什么字符串不能被整数值索引

从正式文件如下:

不同的人物角色需要不同数量的内存来存储的,所以为了确定哪些字符是在特定位置上的解释,你必须遍历每个Unicode标量从该字符串的开始或结束。因此,Swift字符串不能被整数值索引

我已经读了好几遍,我还是不太明白。有人能解释我为什么Swift字符串不能被整数值索引吗?

很多谢谢

+0

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html - 这是你正在谈论的话题。至于我,比起你从头到尾阅读这个主题更难以解释清楚。 –

+4

快速提示,不是一个完整的解释:Swift字符串尊重unicode,例如,某些表情符号是“合成”字符,它们显示为一个字符,但它们实际上最多可以使用四个真实字符 - 仅仅是我们没有看到它,几个字符在显示时组合成一个。这就是为什么我们不能依赖Swift中字符串中字符的“索引”。 – Moritz

+0

@Moritz,这解释了为什么你不能通过将它映射到相应的unicode代码点来实现整数索引,因为它们出现在内存中,但它并不妨碍实现'myString [8]'对应的接口'myString'中的第7个规范符号。 你的提示是绝对正确的,但以上是为什么我 - 也可能是其他人 - 查找问题。 –

回答

1

字符串作为字节数组存储在内存中。

给定的字符可能需要1到4个字节的基本码点,再加上任意数量的组合变音标记。

例如,é需要2个字节。现在

,如果你有串efghéfgh,进入第二个字符(f),为第一个字符串的字符是字节数组索引1,对于第二个字符串,它是在指数2

为了知道这一点,你需要检查第一个字符。要根据索引访问任何字符,您需要浏览所有以前的字符,以了解每个字节需要多少个字节。

+0

字符可以比4字节宽。 ''g͇̫͛͆̾ͫ̑͆“.characters.count == 1 &&”g͇̫͛͆̾ͫ̑͆“.lengthOfBytes(using:.utf8)== 17' –

+0

@BrianNickel是的,我忘了你可以添加变音符号并合并它们。 (在我的例子中,é也作为一个独立的角色存在)。但是每个代码点都被编码为1到4个字节。 – njzk2

相关问题