知识卡片

字符串禁止整数下标的原因

专业/工作 · 742.a

内容

Swift字符串不能用playground[3]这样的整数下标直接取字符,编译器会直接报错,必须先用startIndex配合index(_:offsetBy:)按位移得到一个String.Index才能取值。原因是[[扩展字形簇是Swift字符的设计单位]]——每个字符占用的底层Unicode标量数量不固定,要知道”第3个字符”在底层存储的哪个位置,唯一办法是从头遍历数完,这是O(n)操作而非O(1)。Swift选择在类型系统层面禁掉容易让人误以为是O(1)的整数下标,强迫开发者显式走一遍索引计算,等于把”这个操作其实很慢”的事实暴露在调用方式上,而不是悄悄提供一个性能陷阱。

参考来源

《Swift编程权威指南》第7章《字符串》