Предисловие
Добавление функций или синтаксического сахара в текстовые строки распространено на различных языках программирования. Возьмите, к примеру, с языком C, с которым все знакомы. Строка C - это, по сути, массив символов, но каждый раз, когда вы вводите строку, вам не нужно вводить ['H', 'e', 'l', 'l', 'o'], просто нажмите привет, потому что компилятор выполняет эту операцию для вас.
Более продвинутые языки, такие как Swift, обрабатывают строки не только как массивы символов, строка является полным типом и имеет различные характеристики. Давайте сначала посмотрим на функцию String: Substring.
Взгляните на строку
Во -первых, давайте примем грубое понимание реализации струн. Следующий код поступает из String.Swift в стандартной библиотеке:
public Struct String {public var _core: _stringcore}Конечно, есть некоторые другие настройки инициализации, но в объявлении есть только этот атрибут хранения! Секрет должен быть в stringcore.swift:
public struct _stringcore {public var _baseaddress: uncafemutablerawpointer? var _countandflags: uint public var _owner: AnyObject?}Есть много других вещей в этом типе, но мы сосредоточены только на свойствах хранения:
Реальная ситуация _stringcore гораздо сложнее, чем упомянуто здесь, но приведенный выше контент облегчает понимание некоторой информации о строках: внутреннее хранилище и размер строк.
Подстроение
Как создать подстроение в Swift? Самый простой способ - взять абзац из строки по подписанию:
Пусть str = "Привет, Swift!" let slice = str [str.startindex .. <str index = "" str = "" startIndex = "" nbsp = "" offsetby: = "" 5 = "" hello = ""> </str>
Хотя это просто, код не выглядит слишком элегантно.
Индекс строки не является интуитивным целым числом, поэтому индекс положения во время перехвата должен быть получен с помощью StartIndex и индекса (_: offsetby :). Если вы перехватываете из начальной позиции строки, вы можете опустить StartIndex:
let withPartialRange = str [.. <str index = "" str = "" startIndex = "" nbsp = "" offsetby: = "" 5 = "" into = "" hello = ""> </str>
Или используйте этот метод в сборе:
Пусть slice = str.prefix (5) // все еще "Привет"
Помните, что строки также являются коллекциями, поэтому вы можете использовать методы под коллекциями, такие как префикс (), суффикс (), dropfirst () и т. Д.
Внутренние принципы подстроения
Подстроение волшебного места - это то, что они повторно используют память родительской строки. Вы можете понимать подстроение как один из абзацев родительской строки.
Например, если вы вырезаете 100 символов из строки символов 8000, вам не нужно повторно реализовать пространство памяти 100 символов.
Это также означает, что вы можете случайно расширить жизненный цикл родительской строки. Если есть большая строка, то вы просто перехватываете небольшой сегмент, если перехваченная строка с небольшим сегментом не будет выпущена, большая строка сегмента не будет выпущена.
Как делается подстроение?
public struct substring {Internal var _slice: rangereplacableBideRectionAlslice <string> </string>Внутренний атрибут _slice содержит всю информацию о родительской строке:
// все еще внутри субстрангинтернального var _whoLestring: string {return _slice._base} public var startIndex: index {return _slice.startIndex} public var endIndex: index {return _slice.endindex}Вычислите свойство _WhOleString (возвращает всю родительскую строку), StartIndex и EndIdex возвращаются через внутреннюю _slice.
Также можно увидеть, как Slice относится к родительской строке.
Подстроение к строке
Наконец, в коде может быть много подстроков, но тип параметра функции требует строки. Процесс преобразования подстроки в строку также очень прост:
Let String = String (substring)
Поскольку Substrings делится тем же пространством памяти, что и ее родительская строка, догадается, что создание новой строки должно инициализировать новое пространство для хранения. Так в чем же процесс инициализации строки?
string string {public init (_ substring: substring) {// 1 let x = substring._whoLestring // 2 let start = substring.StartIndex let end = substring.endindex // 3 let U16 = x._core [start.encodedoffset .. <end encodedOffse = "" nbsP = "" 4A = "" if = "" if = "" if = "" if = "" if = "" if = "" if = "" incodedOffset = "" nbspec В: = "" x = "" UnicoDescalars = "" end = "" self = "" 4b = "" else = ""> </end>Шаги по преобразованию подстроки в строку очень просты, но вы можете подумать, нужно ли вам это сделать. Требуется ли вам тип строки при выполнении операций подстроки? Если все операции на подстроении должны быть преобразованы в строку, то легкая подстроение потеряет свое значение.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.