Swift 標準ライブラリ >     String


構造体


String


文字のコレクションである Unicode 文字列値。





概観


文字列は、"Swift" のような一連の文字です。Swift の文字列は、Unicode であり正確で、ロケールを区別せず、効率的になるように設計されています。String 型は Objective-C クラスの NSString とブリッジし、文字列で動作する C 関数との相互運用性を提供します。


文字列リテラルまたは文字列補間を使用して新しい文字列を作成できます。文字列リテラルは、引用符で囲まれた一連の文字です。


let greeting = "Welcome!"


文字列補間は、含まれる式を評価し、結果を文字列形式に変換する文字列リテラルです。文字列補間は、複数の部分から文字列を作成する簡単な方法です。各式をカッコ内の文字列補間に包み込み、先頭にバックスラッシュを付けます。


let name = "Rosa"
let personalizedGreeting = "Welcome, \(name)!"

let price = 2
let number = 3
let cookiePrice = "\(number) cookies: $\(price * number)."


連結演算子(+) を使用して、文字列を結合します。


let longerGreeting = greeting + " We're glad you're here!"
print(longerGreeting)
// Prints "Welcome! We're glad you're here!"


文字列の変更と比較


文字列には常に値の意味があります。文字列のコピーを変更してもオリジナルには影響を与えません。


var otherGreeting = greeting
otherGreeting += " Have a nice time!"
print(otherGreeting)
// Prints "Welcome! Have a nice time!"

print(greeting)
// Prints "Welcome!"


等号演算子(==) または関係演算子(<>= のような) を使用して文字列の等しさを比較することは、常に Unicode 正規表現を使用して実行されます。これは、文字列の異なる表現が等しいとすることを意味します。


let cafe1 = "Cafe\u{301}"
let cafe2 = "Café"
print(cafe1 == cafe2)
// Prints "true"


Unicode コードポイント "\u{301}" は、前の文字にアクセントを含むように変更するので、"e\u{301}" は単一の Unicode コードポイント "é" と同じ正規表現を持ちます。


基本的な文字列操作は、ロケール設定には影響を受けません。これにより、文字列の比較やその他の操作では、常に単一の安定した結果が得られ、Dictionary インスタンスのキーとして、およびその他の目的で文字列をキーとして使用できるようになります。


文字列の表現:ビュー


文字列自体はコレクションではありません。代わりに、その内容を意味のあるコレクションとして提示するプロパティを持っています。これらのコレクションのそれぞれは、文字列の見ることのできる、またデータ表現の特定の型の ビュー です。


すべての文字列で使用できるさまざまなビューを示すために、以下の例ではこの String インスタンスを使用しています。


let cafe = "Cafe\u{301} du 🌍"
print(cafe)
// Prints "Café du 🌍"


キャラクタービュー


文字列の characters プロパティは、人間が読める文字に近い 拡張書記素クラスタ のコレクションです。"é"、"김"、"🇮🇳" などの多くの個々の文字は、複数の Unicode コードポイントで構成することができます。これらのコードポイントは、Unicode の境界アルゴリズムによって、Swift の Character の型で表される拡張書記素クラスタに結合されます。characters ビューの各要素は、Character インスタンスによって表されます。


print(cafe.characters.count)
// Prints "9"
print(Array(cafe.characters))
// Prints "["C", "a", "f", "é", " ", "d", "u", " ", "🌍"]"


cafe 文字列の見える各々の文字は、characters ビューの別個の要素です。


Unicode スカラービュー


文字列の unicodeScalars プロパティは、Unicode のスカラー値のコレクションで、Unicode の基本単位である 21 ビットのコードです。各スカラー値は、UnicodeScalar インスタンスで表され、UTF-32 コードユニットと同等です。


print(cafe.unicodeScalars.count)
// Prints "10"
print(Array(cafe.unicodeScalars))
// Prints "["C", "a", "f", "e", "\u{0301}", " ", "d", "u", " ", "\u{0001F30D}"]"
print(cafe.unicodeScalars.map { $0.value })
// Prints "[67, 97, 102, 101, 769, 32, 100, 117, 32, 127757]"


unicodeScalars ビューの要素は、cafe 文字列の各 Unicode スカラ値を構成します。特に、cafe"é" 文字の分解した形式を使用して宣言されているため、unicodeScalars には文字 "e"(101) とアクセント文字 "'"(769) の両方のコードポイントが含まれています。


UTF-16 ビュー


文字列の utf16 プロパティは、文字列の Unicode スカラ値の 16 ビットコード化形式である UTF-16 コード単位のコレクションです。各コードユニットは UInt16 インスタンスとして格納されます。


print(cafe.utf16.count)
// Prints "11"
print(Array(cafe.utf16))
// Prints "[67, 97, 102, 101, 769, 32, 100, 117, 32, 55356, 57101]"


utf16 ビューの要素は、UTF-16 でコード化されたときの文字列のコード単位です。


このコレクションの要素は、インデックス付き NSString API を通じてアクセスされるものと一致します。


let nscafe = cafe as NSString
print(nscafe.length)
// Prints "11"
print(nscafe.character(at: 3))
// Prints "101"


UTF-8 ビュー


文字列の utf8 プロパティは、文字列の Unicode スカラ値の 8 ビットコー化形式である UTF-8 コード単位のコレクションです。各コードユニットは UInt8 インスタンスとして格納されます。


print(cafe.utf8.count)
// Prints "14"
print(Array(cafe.utf8))
// Prints "[67, 97, 102, 101, 204, 129, 32, 100, 117, 32, 240, 159, 140, 141]"


utf8 ビューの要素は、UTF-8 でコード化されたときの文字列のコード単位です。この表現は、String インスタンスが C の APIに渡されるときに使用されるものと一致します。


let cLength = strlen(cafe)
print(cLength)
// Prints "14"


文字列の長さを数える


文字列の長さを知る必要があるときは、最初に長さを何に使うかを検討しなければなりません。スクリーンに表示される文字数を測定しているのか、特定のコード化で文字列に必要な記憶領域を測定しているのですか?単一の文字列は、異なるビューによって測定された場合、長さが大きく異なります。


例えば、大文字 A のような ASCII 文字は、その 4 つのビューのそれぞれで単一の要素として表されます。A の Unicode スカラー値は 65 で、UTF-16 と UTF-8 の両方で単一のコード単位に収まるのに十分小さいです。


let capitalA = "A"
print(capitalA.characters.count)
// Prints "1"
print(capitalA.unicodeScalars.count)
// Prints "1"
print(capitalA.utf16.count)
// Prints "1"
print(capitalA.utf8.count)
// Prints "1"


一方、絵文字の旗文字は、"\u{1F1F5}""\u{1F1F7}" のような Unicode スカラ値の組から構築されます。これらのスカラー値はそれぞれ大きすぎるため、単一の UTF-16 または UTF-8 コードユニットには収まりません。その結果、文字列 "🇵🇷" の各ビューは異なる長さを報告します。


let flag = "🇵🇷"
print(flag.characters.count)
// Prints "1"
print(flag.unicodeScalars.count)
// Prints "2"
print(flag.utf16.count)
// Prints "4"
print(flag.utf8.count)
// Prints "8"


文字列ビュー要素へのアクセス


文字列の個々の要素を検索するには、タスクに適切なビューを使用します。たとえば、長い文字列の最初の単語を検索するには、characters ビューで空白を検索し、characters ビューの接頭辞からその点までの新しい文字列を作成します。


let name = "Marie Curie"
let firstSpace = name.characters.index(of: " ")!
let firstName = String(name.characters.prefix(upTo: firstSpace))
print(firstName)
// Prints "Marie"


インデックスを文字列のビューの 1 つに変換し、別のビューのインデックスに変換できます。


let firstSpaceUTF8 = firstSpace.samePosition(in: name.utf8)
print(Array(name.utf8.prefix(upTo: firstSpaceUTF8)))
// Prints "[77, 97, 114, 105, 101]"


パフォーマンスの最適化


Swift の文字列には値の意味がありますが、文字列はデータをバッファに保存するためにコピーオンライト戦略を使用します。このバッファは、文字列の異なるコピーで共有することができます。文字列のデータは、複数の文字列インスタンスが同じバッファを使用している場合にのみ、遅延してコピーされます。したがって、変異操作の順序の最初は、O(n) の時間と空間を要します。


文字列の連続した記憶領域がいっぱいになると、新しいバッファを割り当てる必要があり、データを新しい記憶領域に移動する必要があります。文字列のバッファーは指数関数的に成長して、多くの追加操作で平均化したときに文字列に一定の時間がかかります。


String と NSString の間をブリッジする


全ての String インスタンスは、型キャスト演算子(as) を使用して NSString にブリッジでき、Objective-C で生成された全ての String インスタンスはその記憶領域として NSString インスタンスを使用できます。NSString の全ての任意のサブクラスは String インスタンスになりえるため、String インスタンスが NSString の記憶領域によって支えられている場合の表現や効率性は保証されません。NSString は不変であるため、記憶領域がコピーによって共有されているかのようになります。変異操作のシーケンスの最初のものは、要素が O(n) の時間と空間を要する一意の連続した記憶領域にコピーされ、ここで n は文字列のコード化された表現の長さです(基となる NSString に異常なパフォーマンス特性がある場合はそれ以上です)。


この議論で使用されている Unicode 用語の詳細については、Unicode.org の用語集 を参照してください。特に、この議論では、拡張書記素クラスタUnicode スカラ値、および 基本等価性 (canonical equivalence)について言及しています。


入れ子になった型


目次
Xcode 10 の新機能

  • 言語:Swift
  • 概観
  • 入れ子になった型












  • トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)