swift 子字符串如何与原始字符串共享内存?

j7dteeu8  于 2022-12-02  发布在  Swift
关注(0)|答案(1)|浏览(162)

下列程式码会建立字串,然后从该字串建立子字串:

let x = "a quick brown fox jumped over the lazy dog"

let range = x.startIndex...x.index(x.startIndex, offsetBy: 6)
var substring = x[range]

据我所知,substring应该与字符串x共享内存,但如果这样做:

substring.replaceSubrange(substring.startIndex...substring.startIndex, with: "t")

print(substring)
print(x)

我得到以下输出:

t quick
a quick brown fox jumped over the lazy dog

也就是说他们不再共享同一个记忆。
那么,内存共享是如何工作的呢?对replaceSubrange的调用是不是在substring对象中创建一个文本“a quick”的防御性副本,然后用“t”替换第一个字母“a”?
或者“quick”仍然与原始字符串x共享,但新的内存只分配给第一个字符“t”?据我所知,这应该是不可能的,因为数组连续存储它们的内存。
那么,substring在什么时候停止与x共享内存呢?

ghg1uchk

ghg1uchk1#

根据Apple's docsSubstring示例是字符串切片的结果。它与原始字符串共享其存储空间,该字符串存储在此SubString中,而不是原始字符串。
首先,你需要知道,就像你的例子x是一个字符串,它是一个值,而不是一个类,所以它共享它的内存,而x永远不会发生。
当你创建一个Substring时,它会自动将你的x的值a quick brown fox jumped over the lazy dog复制到一个Slice<String>类型中,作为base,并返回给你一个Substring,它是这个Slice<String>String.SubSequence
正因为如此,当你改变x的值时,不会使Slice<String>的值也改变。
像这样的例子

var x = "a quick brown fox jumped over the lazy dog" // your original string

let range = x.startIndex...x.index(x.startIndex, offsetBy: 6)
var substring = x[range] // copy your original and combine with start index and end index

print("first substring: ", substring) // your desire result
print("base of substring: ", substring.base) // the value of x when clone into when creating substring

x = "abcder" // changing value x

print("second substring: ", substring) // still the same
print("base of substring: ", substring.base) // still the same

相关问题