トップページ » 文字列と文字
18 Jun 2014 13:29公開
Swiftの文字列と文字はCレベルの軽量と現代言語の多彩な機能をサポートします。
- C言語と同じような文字列""と文字''
- 軽量
- +オペレーターで文字と文字列の操作
- Unicode
- 文字列補間
- FoundationフレームワークでNSStringとシムレスの互換性
文字列リテラル
文字列リテラルは、二重引用符""で囲まれたテキストの文字です。
文字列リテラルは定数または変数の初期値として定義できます。(タイプの推論)
let someString = "Some string literal value"
文字列リテラルは、次の特殊文字を含めることができます。
エスケープされた特殊文字
\0 (ヌル文字)、
\\ (バックスラッシュ)、
\t (水平タブ)、
\n (改行)、
\r (キャリッジリターン)、
\" (二重引用符)
\' (一重引用符)
半角のUnicodeスカラー
\xnn 、 nn 2桁の16進数
2バイトのUnicodeのスカラー
\unnnn 、 nnnn 4桁の16進数
4バイトのUnicodeスカラー
\Unnnnnnnn 、 nnnnnnnn 8進数字
以下のコードは、特殊文字の例です。
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein" // "Imagination is more important than knowledge" - Einstein let dollarSign = "\x24" // $, Unicode scalar U+0024 let blackHeart = "\u2665" // ♥, Unicode scalar U+2665 let sparklingHeart = "\U0001F496" // 💖, Unicode scalar U+1F496
空の文字列を初期化する
空の作成するには、String長い文字列を構築するための出発点としての値を、いずれかの変数に空の文字列リテラルを割り当てるか、新しい初期化String初期化構文を使用してインスタンスを:
var emptyString = "" // empty string literal var anotherEmptyString = String () // initializer syntax // these two strings are both empty, and are equivalent to each other
いるかどうかを調べることができます。空のチェックはisEmptyプロパティで確認します。
if emptyString.isEmpty { println ( "Nothing to see here" ) } // prints "Nothing to see here"
文字列の可変性
varで宣言した変数は変更できますが、letで宣言した定数は変更できません。
var variableString = "Horse" variableString += " and carriage" // variableString is now "Horse and carriage" let constantString = "Highlander" constantString += " and another Highlander" // this reports a compile-time error - a constant string cannot be modified
文字列は値の型(Value Type)
SWIFTのString型は値の型(Value Type)です。Stringのインスタンスが関数やメソッドに渡されたとき、あるいは、定数または変数に代入されとき、値がコピーされて新しいStringインスタンスが作成されます。いずれの場合にも、新しいコピーが作成され、新しいコピーが渡されます。値の型について「構造体と列挙が値の型」を参考してください。
ノート
Swiftのこの特性はココアのNSStringと違います。NSStringは明確な指定がない場合、デフォルトでリファレンスを引き渡す。
Swiftのデフォルトでコピーする特性は関数やメソッドで安全、安心に処理をお行えます。関数、メソッドなかでは、自身のコードが文字列を変更しない限り、値が変わりません。
Swiftのコンパイラーは「コピー」を本当に必要の場合のみ、必要最小限にオプティマイズします。
文字を使用した作業
SWIFTのString型は、順序のあるCharacterコレクションですから、for-inループでアクセスすることができます。
for character in "Dog!" { println(character) } // D // o // g // !
また、明確に一文字の文字列で、文字を初期化することができます。
let yenSign: Character = "¥"
文字を数える
countElements()
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪" println("unusualMenagerie has \(countElements(unusualMenagerie)) characters") // prints "unusualMenagerie has 40 characters"
ノート
それぞれのユニコードのタイプを格納するのに、メモリのサイズが異なります。countElements()について下記の注意事項があります:
- 文字カウントを計算するのに、countElements()はすべての文字を確認する必要がありますので、長い文字列を処理する場合時間がかかります。
- countElements()はNSStringのlengthプロパティーと常に一致するわけではありません。NSStringのlengthは16-bitコードの数でUTF-16を計算していますが、ユニコードの数ではありません。Swiftの文字カウントを取得するためには、NSStringでutf16countで文字カウントを取得する必要があります。
連結文字列と文字
「+」と「+=」で文字列を繋がります。
let string1 = "hello" let string2 = " there" let character1: Character = "!" let character2: Character = "?" let stringPlusCharacter = string1 + character1 // equals "hello!" let stringPlusString = string1 + string2 // equals "hello there" let characterPlusString = character1 + string1 // equals "!hello" let characterPlusCharacter = character1 + character2 // equals "!?"
var instruction = "look over" instruction += string2 // instruction now equals "look over there" var welcome = "good morning" welcome += character1 // welcome now equals "good morning!"
文字列の補間( Interpolation)
Perl、Python、PHPなどスクリプト言語と同じように、Swiftは文字列中に式の値を文字列に簡単に変換します。
let multiplier = 3 let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)" // message is "3 times 2.5 is 7.5"
ノート
展開された文字列内の内にかっこを記述式は、エスケープされていない二重引用符(")またはバックスラッシュ(\)、キャリッジリターンや改行を含めることはできません。
文字列比較
let quotation = "We're a lot alike, you and I." let sameQuotation = "We're a lot alike, you and I." if quotation == sameQuotation { println("These two strings are considered equal") } // prints "These two strings are considered equal"
接頭辞と接尾辞比較
let romeoAndJuliet = [ "Act 1 Scene 1: Verona, A public place", "Act 1 Scene 2: Capulet's mansion", "Act 1 Scene 3: A room in Capulet's mansion", "Act 1 Scene 4: A street outside Capulet's mansion", "Act 1 Scene 5: The Great Hall in Capulet's mansion", "Act 2 Scene 1: Outside Capulet's mansion", "Act 2 Scene 2: Capulet's orchard", "Act 2 Scene 3: Outside Friar Lawrence's cell", "Act 2 Scene 4: A street in Verona", "Act 2 Scene 5: Capulet's mansion", "Act 2 Scene 6: Friar Lawrence's cell" ]
接頭辞比較 hasPrefix
var act1SceneCount = 0 for scene in romeoAndJuliet { if scene.hasPrefix("Act 1 ") { ++act1SceneCount } } println("There are \(act1SceneCount) scenes in Act 1") // prints "There are 5 scenes in Act 1"
接尾辞比較 hasSuffix
var mansionCount = 0 var cellCount = 0 for scene in romeoAndJuliet { if scene.hasSuffix("Capulet's mansion") { ++mansionCount } else if scene.hasSuffix("Friar Lawrence's cell") { ++cellCount } } println("\(mansionCount) mansion scenes; \(cellCount) cell scenes") // prints "6 mansion scenes; 2 cell scenes"
大文字と小文字の文字列
let normal = "Could you help me, please?" let shouty = normal.uppercaseString // shouty is equal to "COULD YOU HELP ME, PLEASE?" let whispered = normal.lowercaseString // whispered is equal to "could you help me, please?"
ユニコード
SWIFTのStringとCharacter型は、完全にUnicode準拠をサポートします。
文字列のUnicodeの表現
for-inのほかに、Swiftの文字列は下記のUnicode準拠のほかの三つ方法でアクセスすることができます。
- UTF-8コードの集合(文字列のutf8プロパティーでアクセス)
- UTF-16コードの集合(文字列のutf16プロパティーでアクセス)
- 21ビットのUnicodeスカラー値の集合(文字列のunicodeScalarsプロパティーでアクセス)
UTF-8
for codeUnit in dogString.utf8 { print("\(codeUnit) ") } print("\n") // 68 111 103 33 240 159 144 182
UTF-16
for codeUnit in dogString.utf16 { print("\(codeUnit) ") } print("\n") // 68 111 103 33 55357 56374
Unicodeのスカラー
for scalar in dogString.unicodeScalars { print("\(scalar.value) ") } print("\n") // 68 111 103 33 128054
各UnicodeScalar値は、新たなStringを初期化することができます。
for scalar in dogString.unicodeScalars { println("\(scalar) ") } // D // o // g // !
シリーズ
記事のリスト
- 文字列と文字
レーティング
コメント