序文
テキスト文字列に機能または構文砂糖を追加することは、さまざまなプログラミング言語で一般的です。たとえば、誰もがよく知っているC言語を取ります。 C文字列は本質的に文字配列ですが、文字列を入力するたびに['h'、 'e'、 'l'、 'l'、 'o']を入力する必要はありません。
Swiftなどのより高度な言語は、文字配列だけでなく文字列を処理し、文字列は完全なタイプであり、さまざまな特性があります。まず、文字列の機能:Substringを見てみましょう。
文字列を見てください
まず、文字列の実装を大まかに理解しましょう。次のコードは、標準ライブラリのstring.swiftから掲載されています。
public struct string {public var _core:_stringcore}もちろん、他にもいくつかの初期化設定がありますが、宣言にはこのストレージ属性のみがあります!秘密はstringcore.swiftにある必要があります:
public struct _stringcore {public var _baseaddress:unsafemutablerawpointer? var _countandflags:uint public var _owner:anyobject?}このタイプには他にも多くのことがありますが、ストレージプロパティのみに焦点を当てています。
_stringcoreの実際の状況は、ここで述べたよりもはるかに複雑ですが、上記のコンテンツにより、文字列に関する情報を理解しやすくなります。内部ストレージと文字列のサイズです。
サブストリング
Swiftでサブストリングを作成する方法は?最も簡単な方法は、subscriptで文字列から段落を取ることです。
let str = "hello swift!" let slice = str [str.startindex .. <str index = "" str = "" startindex = "" nbsp = "" offsetby:= "" 5 = "" hello = "" "> </str>
簡単ですが、コードはあまりエレガントに見えません。
文字列のインデックスは直感的な整数ではないため、StartIndexとIndex(_:offsetby :)を使用して、インターセプト中の位置インデックスを取得する必要があります。文字列の開始位置から傍受した場合、startindexを省略できます。
with partialrange = str [.. <str index = "" str = "" startindex = "" nbsp = "" offsetby:= "" 5 = "" still = "" hello = ""> </str>
または、コレクションでこの方法を使用します。
let slice = str.prefix(5)//
文字列もコレクションであることを忘れないでください。そのため、プレフィックス()、suffix()、dropfirst()などのコレクションの下でメソッドを使用できます。
サブストリングの内部原則
魔法のような場所をサブストリングすることは、親文字列の記憶を再利用することです。サブストリングは、親文字列の段落の1つとして理解できます。
たとえば、8000文字の文字列から100文字をカットした場合、100文字のメモリスペースを再現する必要はありません。
これは、親文字列のライフサイクルを誤って延長することもできます。大きな文字列がある場合、傍受された小さなセグメント文字列がリリースされない限り、小さなセグメントを傍受するだけです。大きなセグメント文字列はリリースされません。
サブストリングはどのように行われますか?
public struct substring {内部var _slice:rangereplacaibleBidirectionalslice <string> </string>内部_slice属性は、親文字列に関するすべての情報を保持します。
//まだSubstringinternal var _Wholestring:String {return _slice._base} public var startindex:index {return _slice.startindex} public var endindex:index {return _slice.endindex}プロパティを計算_Wholestring(親文字列全体を返します)、StartIndex、およびEndIndexは両方とも内部_sliceから返されます。
また、スライスが親文字列をどのように指すかを見ることができます。
文字列へのサブストリング
最後に、コードには多くのサブストリングがあるかもしれませんが、関数のパラメータータイプには文字列が必要です。サブストリングを文字列に変換するプロセスも非常に単純です。
let string = string(substring)
サブストリングは親文字列と同じメモリスペースを共有しているため、新しい文字列を作成すると、新しいストレージスペースが初期化されると推測されます。それでは、文字列を初期化するプロセスは何ですか?
拡張文字{public init(_ substring:substring){// 1 let x = substring._wholestring // 2 let start.startindex let end = substring.endindex // 3 let u16 = x._core [start.encodedoffset .. in:= "" x = "" unicodescalars = "" end = "" self = "" 4b = "" else = ""> </end>サブストリングを文字列に変換する手順は非常に単純ですが、これを行う必要があるかどうかを検討することをお勧めします。サブストリング操作を実行するときに、タイプを文字列にする必要がありますか?サブストリングに関するすべての操作を文字列に変換する必要がある場合、軽量のサブストリングはその意味を失います。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。