加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用var时,Swift是否具有二次字符串连接?

发布时间:2020-12-14 04:57:42 所属栏目:百科 来源:网络整理
导读:In the Swift Language Reference,under String Mutability它说: You indicate whether a particular String can be modified (or mutated) by assigning it to a variable (in which case it can be modified),or to a constant (in which case it cannot
In the Swift Language Reference,under String Mutability它说:

You indicate whether a particular String can be modified (or mutated) by assigning it to a variable (in which case it can be modified),or to a constant (in which case it cannot be modified)

我不清楚可变的“它”是变量还是值.

例如,如果我写:

var s = ""
for i in 0...100 {
  s += "a"
}

它类似于创建NSMutableString并调用appendString 100次(即线性成本)?

或者它类似于创建一系列更大的NSString实例并将它们与stringByAppendingString组合(即二次成本)?

或者它可能会在幕后创建某种绳索结构,因此它是不可变的和线性的聚合?

解决方法

附加到这样的集合(虽然String本身不是一个集合,你实际上是用它代码附加到它的字符视图)是线性的,而不是二次的. Swift中的一个字符串有一个内部缓冲区,当它填满时它的大小加倍,这意味着当你重复追加时,你会看到越来越少的重新分配.文档描述了以这种方式附加为“摊销”的O(1)操作:大多数时候附加的是O(1),但有时它需要重新分配字符串的存储.

数组,集和词典具有相同的行为,但是如果您知道要多次追加,也可以为数组保留特定容量(使用reserveCapacity(_ :)).

所有这些集合都使用“copy-on-write”来保证值语义.这里,x和y共享一个缓冲区:

let x = "a"
let y = x

如果你改变x,它会获得一个新的,唯一的缓冲区副本:

x += "b"
// x == "ab"
// y == "a"

之后,x有自己的缓冲区,因此后续的突变不需要复制.

x += "c"   // no copy unless buffer is full

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读