Swift 的 String.count 的主要内容是什么?

Dec*_*nna 6 arrays big-o swift

当 swift 使用String.count它时:

O(n)每次我们调用它时,我们都会遍历整个 String 以对其进行计数

或者

O(1)其中 swift 之前存储了这个数组的大小并简单地访问它。

Cod*_*ent 6

绝对是O(n)。从斯威夫特书

因此,如果不遍历字符串以确定其扩展字素簇边界,就无法计算字符串中的字符数。如果您正在处理特别长的字符串值,请注意该count属性必须遍历整个字符串中的 Unicode 标量,以确定该字符串的字符。

这有一些含义,其中最大的是整数下标(即str[5])不能通过标准库使用。在内部,String使用 ASCII 或 UTF-16 编码(从 Swift 5 开始,它使用UTF-8)。如果字符串仅使用 ASCII 字符,则count可以,O(1)但 ASCII 只有 127 个字符,因此将此视为例外而不是规则。

NSString,另一方面,总是使用 UTF-16,所以访问它的lengthO(1). 还要记住NSString.length != String.count(尝试带有表情符号的字符串,你会看到)。

至于你的第二个问题,它不会count为后续调用缓存。count因此O(n),每次调用都是,即使字符串没有改变。基金会回购中的代码也证实了这一点。