次の例はすべて
var str = "Hello, playground"
スウィフト4
Swift 4で文字列がかなり大幅に見直されました。文字列から部分文字列を取得すると、Substring
型ではなく型が返されます。String
ます。どうしてこれなの?文字列はSwiftの値型です。つまり、1つの文字列を使用して新しい文字列を作成する場合は、それをコピーする必要があります。これは安定性には役立ちますが(知らないうちに変更されることはありません)、効率は良くありません。
一方、部分文字列は、元の文字列への参照です。これはそれを説明するドキュメントからの画像です。
コピーは不要なので、使用する方がはるかに効率的です。ただし、100万文字の文字列から10文字の部分文字列を取得したとします。サブストリングはストリングを参照しているため、サブストリングが存在する限り、システムはストリング全体を保持する必要があります。したがって、部分文字列の操作が完了したら、それを文字列に変換します。
let myString = String(mySubstring)
これは上だけで部分文字列をコピーし、古い文字列を保持するメモリをすることができます再利用します。部分文字列(型として)は、短命であることを意味します。
Swift 4のもう1つの大きな改善点は、文字列がコレクションであることです(ここでも)。つまり、コレクションに対して実行できることは何でも、文字列に対しても実行できます(添え字を使用する、文字を反復処理する、フィルターなど)。
次の例は、Swiftで部分文字列を取得する方法を示しています。
部分文字列を取得する
あなたは(例えば、添字または他の多くの方法を使って、文字列から部分文字列を取得することができprefix
、suffix
、split
)。ただし、範囲のインデックスではString.Index
なく、まだ使用する必要がありInt
ます。(私の他の答えを見てください助けが必要な場合。)
文字列の始まり
下付き文字を使用できます(Swift 4の片側範囲に注意してください)。
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
またはprefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
またはさらに簡単:
let mySubstring = str.prefix(5) // Hello
文字列の終わり
下付き文字の使用:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
またはsuffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
またはさらに簡単:
let mySubstring = str.suffix(10) // playground
を使用するときは、を使用suffix(from: index)
して最後から数える必要があったことに注意してください-10
。文字列のsuffix(x)
最後のx
文字のみを使用するを使用する場合、これは必要ありません。
文字列の範囲
ここでも、添え字を使用します。
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
に変換Substring
していますString
忘れずに、部分文字列を保存する準備ができたらString
、古い文字列のメモリをクリーンアップできるように、それをaに変換する必要があります。
let myString = String(mySubstring)
Int
インデックス拡張を使用していますか?
Airspeed VelocityとOle BegemannによるSwift 3のStringsInt
の記事を読んだ後、ベースのインデックス拡張を使用するのをためらっています。Swift 4では文字列はコレクションですが、Swiftチームは意図的にインデックスを使用していません。まだです。これは、さまざまな数のUnicodeコードポイントで構成されるSwift文字に関係しています。実際のインデックスは、文字列ごとに一意に計算する必要があります。Int
String.Index
SwiftチームがString.Index
将来的に抽象化する方法を見つけられることを願っています。しかし、彼らができるまで、私は彼らのAPIを使用することを選択しています。文字列操作は単純なInt
インデックスルックアップではないことを思い出してください。