#swift #string #substring
#swift #строка #подстрока
Вопрос:
Я все еще новичок в 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"
Комментарии:
1. Потому что substring — это, в конце концов, новый объект.
2. Google «Копировать при записи».
Ответ №1:
Это означает, что если вы измените подстроку или исходную строку, они больше не будут ссылкой.
https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html
Эта оптимизация производительности означает, что вам не нужно платить за копирование памяти, пока вы не измените строку или подстроку
Будьте осторожны, используя substring в течение длительного времени
Следовательно, хранение подстрок может продлить срок службы строковых данных, которые больше не доступны иным образом, что может показаться утечкой памяти.
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 по оптимизации подстрок и строк.
Как и у строк, у каждой подстроки есть область памяти, где хранятся символы, составляющие подстроку. Разница между строками и подстроками заключается в том, что в качестве оптимизации производительности подстрока может повторно использовать часть памяти, которая используется для хранения исходной строки, или часть памяти, которая используется для хранения другой подстроки. (Строки имеют аналогичную оптимизацию, но если две строки совместно используют память, они равны.) Эта оптимизация производительности означает, что вам не нужно платить за копирование памяти, пока вы не измените строку или подстроку.
Все эти оптимизации применимы до тех пор, пока не будет изменена строка или подстрока. Если она изменена, строка и подстрока будут отдельными объектами.