iOS
Swift

The Swift Programming Language - Strings and Characters(文字列型、文字型)をまとめる

More than 3 years have passed since last update.

The Swift Programming Language をまとめるトップ


Strings and Characters(文字列型、文字型)

CharacterString タイプがある

String は Character の集合

C言語のシンタックスに類似する

可変(mutability)は、constantvariable 宣言によって決まる

他の値も同様

定数、変数、リテラルなど代入可能


NOTE

String型 は NSString のAPIと同じように使える



String Literals(文字列リテラル)

("")ダブクオートで直接入力された値を代入する

let someString = "リテラル文字列"

Swift が定数 someString に代入される値を String と推論して初期化している


特殊文字


  • \0(null), \(backslash), \t(horizontal tab), \n(line feed), \r(carriage return), \"(double quote) and \'(single quote)

  • Single-byte Unicode scalars \xnn -> nn は hexadecimal(16進数)

  • Two-byte Unicode scalars \xnnnn -> nnnn は hexadecimal(16進数)

  • Four-byte Unicode scalars \xnnnnnnnn -> nnnnnnnn は hexadecimal(16進数)

let wiseWords = "\"想像力は知力に勝る\" - Einstein"

// "想像力は知力に勝る" - Einstein
let dollarSign = "\x24" // $, Unicode scalar U+0024
let blackHeart = "\u2665" // ♥, Unicode scalar U+2665
let sparklingHeart = "\U0001F496" // ?, Unicode scalar U+1F496


Initializing an Empty String(空文字を初期化)

("")空のリテラルか String() を使って初期化できる

var emptyString = "" // 空のリテラル

var anotherEmptyString = String() // イニシャライザー
// 両方ともからの文字列で、等価

isEmpty を使ってから文字を判定

戻り値は Boolean

if emptyString.isEmpty {

println("空文字だよ")
}
// prints "空文字だよ"


String Mutability(可変文字列)

var を使って、変数宣言すると可変文字(mutated)になる

let を使って、定数として宣言すると編集不可

var variableString = "Horse"

variableString += " and carriage"
// variableString が "Horse and carriage" になる

let constantString = "Highlander"
constantString += " and another Highlander"
// コンパイル時にエラーになる


NOTE

ObjC は NSString と NSMutableString を使っていて、異なる



Strings Are Value Types(文字列は値)

Swift の String は値型

新しい文字列の値を定義する場合、文字列型の値を コピー する

文字列形の変数を定義するたびに、新しく値をコピーする


NOTE

NSString の場合、リファレンスを代入したり渡したりする

明示的に指定しない限り、コピーは代入されない

Cocoaとでは仕様が違う


パフォーマンスに関しては、Swift が良きにはからってくれるらしい


Working with Characters(文字型を試す)

for character in "Dog!?" {

println(character)
}
// D
// o
// g
// !
// ?

リテラルで一文字をセットする

let yenSign: Character = "¥"


Counting Characters(文字数のカウント)

countElements を使って文字数をカウント

let unusualMenagerie = "Koala ?, Snail ?, Penguin ?, Dromedary ?"

println("unusualMenagerie は \(countElements(unusualMenagerie)) 文字")
// prints "unusualMenagerie は 40 文字"


NOTE

数え方が違うので、NSString の lenght と同じ結果じゃない場合がある



Concatenating Strings and Characters(文字列と文字の結合)

StringCharacters は(+)または (+=)で繋げる事ができる

let string1 = "hello"

let string2 = " there"
let character1: Character = "!"
let character2: Character = "?"

let stringPlusCharacter = string1 + character1 // は "hello!"
let stringPlusString = string1 + string2 // は "hello there"
let characterPlusString = character1 + string1 // は "!hello"
let characterPlusCharacter = character1 + character2 // は "!?"

var instruction = "look over"
instruction += string2
// instruction が "look over there" になる

var welcome = "good morning"
welcome += character1
// welcome が "good morning!" になる


NOTE

Character型 は一文字しか保持できないので、Character型 には結合する事はできない



String Interpolation(文字列改竄:かいざん)

()を使ってリテラル文字列の中で以下のように書く事ができる

let multiplier = 3

let message = "\(multiplier) x 2.5 = \(Double(multiplier) * 2.5)"
// message is "3 x 2.5 = 7.5"

(multiplier) は multiplier のプレイスホルダーでその実際の値と置き換えられ文字列として生成される


NOTE

エスケープしていない(",',\n,\r)は使えない



Comparing Strings (文字列比較)

三つの比較の方法がある


String Equality(文字列等価)

文字列型の値を評価する

let quotation = "これって同じ?"

let sameQuotation = "これって同じ?"
if quotation == sameQuotation {
println("同じものとして評価されました")
}
// prints "同じものとして評価されました"


Prefix and Suffix Equality(接頭、接尾等価)

hasPrefix と hasSuffix を使う事ができる

文字列を引数として Boolean を返す


例えば

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"
]

Act 1 を数えてみる

var act1SceneCount = 0

for scene in romeoAndJuliet {
if scene.hasPrefix("Act 1 ") {
++act1SceneCount
}
}
println("Act1 は \(act1SceneCount) です")
// prints "Act1 は 5 です"

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) マンションシーン; \(cellCount) セルシーン")
// prints "6 マンションシーン; 2 セルシーン"


Uppercase and Lowercase Strings(大文字、小文字)

uppercaseStringlowercaseString が用意されている

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?"


Unicode

国際化標準の文字コード

基本的に準拠している

※ここはざっくりまとめる


Unicode Terminology

全ての文字が一つもしくは複数のunicodeスカラーで成り立っている

unicode スカラーは21-bitで、 U+0061 が LOWERCASE LATIN LETTER A ("a"), or U+1F425 が FRONT-FACING BABY CHICK ("?").

unicode を何かに書き込むときには、幾つかのUTF-8やUTF16フォーマットに変換する


Unicode Representations of Strings

文字列型のプロパティに utf8, utf16, unicodeScalars があって、それを使って操作できる


例えば

let dogString = "Dog!?" // (犬の絵文字, または Unicode scalar U+1F436):

for codeUnit in dogString.utf8 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 240 159 144 182

for codeUnit in dogString.utf16 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 55357 56374

for scalar in dogString.unicodeScalars {
print("\(scalar.value) ")
}
print("\n")
// 68 111 103 33 128054

for scalar in dogString.unicodeScalars {
println("\(scalar) ")
}
// D
// o
// g
// !
// ?