首页 > 解决方案 > Swift - 我应该创建字符串“count”的局部变量吗?

问题描述

如果我在一个函数中多次使用字符串“计数”,这有关系吗?也就是说,Swift 在第一次计算后是否缓存了“计数”。下面是两个例子,我用哪一个有关系吗?我认为第二个肯定没问题,但第一个呢?我总是看到第一个示例代码。

func Foo1 (str: String) {
...
// calling str.count twice
if x < str.count && y < str.count {
...
}

func Foo2 (str: String) {
...
// calling str.count once
let c = str.count
if x < c && y < c {
...
} 

标签: swiftstringcountswift5

解决方案


.countCollection具有以下复杂性的协议定义:

复杂性:如果集合符合 RandomAccessCollection,则为 O(1);否则,O(n),其中 n 是集合的长度。

字符串不是 RandomAccessCollection。这是一个双向集合,所以它不承诺 O(1)。它只承诺 O(n)。

它绝对不承诺任何缓存(你不应该期望任何缓存)。

碰巧在许多(可能是大多数)情况下,String 的计数被缓存。它是 的一部分_StringObject,是低级存储抽象的一部分,通常由优化器内联。但这一切都没有得到承诺。

也就是说,除非您期望 String 非常大(至少 10kB,可能更多),否则很难想象这是一个主要瓶颈,因为在紧密循环之外被调用两次。与大多数事情一样,您应该写清楚,然后再介绍。为了清楚起见,我可能会创建一个额外的变量,但你不应该在这里过多地猜测。写清楚。然后简介。

您是否正在使用特别大的字符串?


推荐阅读