文字列と文字

トップページ » 文字列と文字

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
// !

シリーズ

記事のリスト

  • 文字列と文字

レーティング

評価: 0+x
当サイトコンテンツライセンスについて個別な指定がなければCreative Commons Attribution-ShareAlike 3.0 Licenseをベースします。転載や引用は大歓迎です。但し、転載・引用・二次利用の場合は当サイト記事へのURLをリンクし出典を明記してください。各作品を大切にして下さい。 また、記事及びコメントを投稿する皆さまも上記のライセンスを理解した上投稿して下さい。 当サイトのコンテンツは皆さまの投稿で作成されますから、当サイトの意思を反映しておりませんが、第三者の知的財産権などの侵害がある場合、当サイトの運営担当にご連絡ください。