LoginSignup
23
23

More than 5 years have passed since last update.

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

Posted at

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
// !
// ?
23
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
23