下列程式码会建立字串,然后从该字串建立子字串:
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
共享内存呢?
1条答案
按热度按时间ghg1uchk1#
根据Apple's docs,
Substring
示例是字符串切片的结果。它与原始字符串共享其存储空间,该字符串存储在此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>
的值也改变。像这样的例子