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

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

概述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 t 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
总结

以上是内存溢出为你收集整理的使用var时,Swift是否具有二次字符串连接?全部内容,希望文章能够帮你解决使用var时,Swift是否具有二次字符串连接?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1016721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存