【问题标题】:Why does change of a substring take no effect on string it subtracted from?为什么子字符串的更改对从中减去的字符串没有影响?
【发布时间】:2019-04-23 14:55:06
【问题描述】:

我还是 Swift 的新手,并阅读了 Apple 的语言指南。

当谈到关于子字符串的字符串章节时,我有一个关于子字符串内容变化的问题。当我更改子字符串而不将其转换为字符串时,原始字符串也应更改,而不是。

正如你从 substring 是如何来的解释中看到的, substring 持有对部分字符串存储的引用。如果子字符串未显式转换为字符串,则对子字符串的操作将对字符串内容生效。

这里是描述问题的代码

var originalString = "hello, world!"
var varSubString = originalString[..<originalString.index(originalString.startIndex, offsetBy: 4)]
print(varSubString)
//print "hell"
varSubString.insert("a", at: varSubString.endIndex)
print(varSubString)
//print "hella"
print(originalString)
//print "hello, world!", but expected to print "hella, world"

【问题讨论】:

  • 因为 substring 毕竟是一个新对象。
  • 谷歌“写时复制”。

标签: swift string substring


【解决方案1】:

这意味着如果您更改子字符串或原始字符串,它们将不再是引用。

https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html

这种性能优化意味着您无需支付 在修改字符串之前复制内存的性能成本 或子串

注意长时间使用子字符串

因此,存储子字符串可能会延长字符串数据的生命周期 以其他方式不再可访问,这似乎是记忆 泄漏。

import UIKit

var str = "Hello, playground"
let index = str.index(str.startIndex, offsetBy: 5)
var mySubstring = str[..<index] // Hello

print(str) // Hello
print(mySubstring) // Hello, playground

str = "Hallo, playground"

print(str) //Hallo, playground
print(mySubstring) //Hello

【讨论】:

    【解决方案2】:

    请参阅Apple document 关于子字符串和字符串优化。

    和字符串一样,每个子字符串都有一个内存区域, 构成子串的字符被存储。区别 字符串和子字符串之间的区别在于,作为性能优化, 子字符串可以重用用于存储 原始字符串,或用于存储另一个字符串的部分内存 子串。 (字符串也有类似的优化,但是如果两个字符串 共享内存,它们是相等的。) 这种性能优化意味着 您不必支付复制内存的性能成本,直到您 修改字符串或子字符串。

    在修改字符串或子字符串之前,所有这些优化都适用。如果它被修改,字符串和子字符串将是一个单独的对象。

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多